精华内容
下载资源
问答
  • Runtime.getRuntime()方法是取得当前JVM的运行环境,也是java中唯一可以得到运行环境的入口。 process这个类是一个抽象类,封装了一个进程,方法如下: Process exec(String command) 在单独的进程中执行指定的...

    一、使用的API说明

    Runtime.getRuntime()方法是取得当前JVM的运行环境,也是java中唯一可以得到运行环境的入口。  

    process这个类是一个抽象类,封装了一个进程,方法如下:

    Process exec(String command) 
              在单独的进程中执行指定的字符串命令。
     Process exec(String command, String[] envp) 
              在指定环境的单独进程中执行指定的字符串命令。
     Process exec(String command, String[] envp, File dir) 
              在有指定环境和工作目录的独立进程中执行指定的字符串命令。
     Process exec(String[] cmdarray) 
              在单独的进程中执行指定命令和变量。 
     Process exec(String[] cmdarray, String[] envp) 
              在指定环境的独立进程中执行指定命令和变量。 
     Process exec(String[] cmdarray, String[] envp, File dir) 
              在指定环境和工作目录的独立进程中执行指定的命令和变量。
    其中:
    command:一条指定的系统命令。
    
    envp:环境变量字符串数组,其中每个环境变量的设置格式为name=value;如果子进程应该继承当前进程的环境,则该参数为null。
    
    dir:子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为null。
    
    cmdarray:包含所调用命令及其参数的数组
    

    国内公共DNS服务器地址:

    1、DNSPod Public DNS:
    
    114.114.114.114
    119.29.29.29
    
    2、阿里公共DNS服务器IPv4地址:
    
    223.5.5.5
    
    3、百度公共DNS服务器IPv4地址:
    
    180.76.76.76
    
    4、oneDNS
    
    117.50.11.11
    
    5、DNSpai Public DNS
    
    中国电信/移动宽带 101.226.4.6 
    
    中国联通宽带 123.125.81.6 
    
    6、CNNIC sDNS
    
    中国互联网络信息中心公共DNS服务器IPv4地址
    
    1.2.4.8
    
    7、CFIEC Public DNS
    
    中国下一代互联网工程中心公共DNS服务器IPv6地址
    
    240c::6666
    
    备用地址240c::6644
    
    9、Google Public DNS
    
    公共DNS服务器IPv4地址
    
    首选地址8.8.8.8
    
    备用地址8.8.4.4
    
    公共DNS服务器IPv6地址
    
    首选地址2001:4860:4860::8888
    
    备用地址2001:4860:4860::8844

    二、JAVA程序

    1、域名解析

    命令cmd:传入参数第一个参数是命令,后边全是参数

    private   String filePath="/home/test/t.sh"; 
    	public   String executeLinuxCmd(String ip,String domain) {
    		String cmdd=filePath;
    	    //传入参数第一个参数是命令,后边全是参数
    		String[] cmd={"sh",cmdd,ip,domain};
    		Runtime run = Runtime.getRuntime();
    		try {
    			Process process = run.exec(cmd);
    			InputStream in = process.getInputStream();
    			BufferedReader bs = new BufferedReader(new InputStreamReader(in));
    			StringBuffer out = new StringBuffer();
    			String line;
    			while ((line = bs.readLine()) != null) {
    				//执行结果加上回车
    				out.append(line).append("\n");
    			}
    			System.out.println("job result ===>[" + out.toString() + "]");
    			in.close();
    			// process.waitFor();
    			process.destroy();
    			return out.toString();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}

    linx脚本:

    测试程序:

            String result = test.executeLinuxCmd("114.114.114.114", "www.baidu.com");
    		System.err.println("结果====>:"+result);
    		String[] results = result.split("\n");
    		ArrayList<String> newResult = new ArrayList<>();
    		//重新组装
    		for (int i = 0; i < results.length; i++) {
    			//规则校验
    			if (RegexUtil.checkIp(results[i])==true) {
    				newResult.add(results[i]);
    			}
    		}
    		//打印结果
    		for (String newResultss : newResult) {
    			System.err.println("ip==>"+newResultss);
    		}

    结果;

    2、测试网是否能够连接服务器

    程序;

            //传入参数第一个参数是命令,后边全是参数
    		String[] cmd={"telnet",ip,port};
    		Runtime run = Runtime.getRuntime();
    		try {
    			Process process = run.exec(cmd);
    			InputStream in = process.getInputStream();
    			BufferedReader bs = new BufferedReader(new InputStreamReader(in));
    			StringBuffer out = new StringBuffer();
    			String line;
    			while ((line = bs.readLine()) != null) {
    				//执行结果加上回车
    				out.append(line).append("\n");
    			}
    			System.out.println("job result ===>[" + out.toString() + "]");
    			in.close();
    			// process.waitFor();
    			process.destroy();
    			return out.toString();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return null;

    测试程序;

    String result = test.executeLinuxCmd("192.168.1.69", "28199");
    System.err.println("结果====>:"+result);

    结果:

    如上结果则网通

     

    展开全文
  • 一、top(Linux命令)执行top命令: (查看进程15477的详细情况,下文用到)系统信息(前五行):第1行:Top 任务队列信息(系统运行状态及平均负载),与uptime命令结果相同。第1段:系统当前时间,例如:16:07:37第2段:...

    一、top(Linux命令)

    执行top命令:    (查看进程15477的详细情况,下文用到)

    ca7388673060ad0657c4c54bc3b2e2ab.png

    系统信息(前五行):

    第1行:Top 任务队列信息(系统运行状态及平均负载),与uptime命令结果相同。

    第1段:系统当前时间,例如:16:07:37

    第2段:系统运行时间,未重启的时间,时间越长系统越稳定。

    格式:up xx days, HH:MM

    例如:241 days, 20:11, 表示连续运行了241天20小时11分钟

    第3段:当前登录用户数,例如:1 user,表示当前只有1个用户登录

    第4段:系统负载,即任务队列的平均长度,3个数值分别统计最近1,5,15分钟的系统平均负载

    系统平均负载:单核CPU情况下,0.00 表示没有任何负荷,1.00表示刚好满负荷,超过1侧表示超负荷,理想值是0.7;

    多核CPU负载:CPU核数 * 理想值0.7 = 理想负荷,例如:4核CPU负载不超过2.8何表示没有出现高负载。

    第2行:Tasks 进程相关信息

    第1段:进程总数,例如:Tasks: 231 total, 表示总共运行231个进程

    第2段:正在运行的进程数,例如:1 running,

    第3段:睡眠的进程数,例如:230 sleeping,

    第4段:停止的进程数,例如:0 stopped,

    第5段:僵尸进程数,例如:0 zombie

    第3行:Cpus CPU相关信息,如果是多核CPU,按数字1可显示各核CPU信息,此时1行将转为Cpu核数行,数字1可以来回切换。

    第1段:us 用户空间占用CPU百分比,例如:Cpu(s): 12.7%us,

    第2段:sy 内核空间占用CPU百分比,例如:8.4%sy,

    第3段:ni 用户进程空间内改变过优先级的进程占用CPU百分比,例如:0.0%ni,

    第4段:id 空闲CPU百分比,例如:77.1%id,

    第5段:wa 等待输入输出的CPU时间百分比,例如:0.0%wa,

    第6段:hi CPU服务于硬件中断所耗费的时间总额,例如:0.0%hi,

    第7段:si CPU服务软中断所耗费的时间总额,例如:1.8%si,

    第8段:st Steal time 虚拟机被hypervisor偷去的CPU时间(如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)

    第4行:Mem 内存相关信息(Mem: 12196436k total, 12056552k used, 139884k free, 64564k buffers)

    第1段:物理内存总量,例如:Mem: 12196436k total,

    第2段:使用的物理内存总量,例如:12056552k used,

    第3段:空闲内存总量,例如:Mem: 139884k free,

    第4段:用作内核缓存的内存量,例如:64564k buffers

    第5行:Swap 交换分区相关信息(Swap: 2097144k total, 151016k used, 1946128k free, 3120236k cached)

    第1段:交换区总量,例如:Swap: 2097144k total,

    第2段:使用的交换区总量,例如:151016k used,

    第3段:空闲交换区总量,例如:1946128k free,

    第4段:缓冲的交换区总量,3120236k cached

    进程信息:

    在top命令中按f按可以查看显示的列信息,按对应字母来开启/关闭列,大写字母表示开启,小写字母表示关闭。带*号的是默认列。

    A: PID = (Process Id) 进程Id;

    E: USER = (User Name) 进程所有者的用户名;

    H: PR = (Priority) 优先级

    I: NI = (Nice value) nice值。负值表示高优先级,正值表示低优先级

    O: VIRT = (Virtual Image (kb)) 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

    Q: RES = (Resident size (kb)) 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

    T: SHR = (Shared Mem size (kb)) 共享内存大小,单位kb

    W: S = (Process Status) 进程状态。D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程

    K: %CPU = (CPU usage) 上次更新到现在的CPU时间占用百分比

    N: %MEM = (Memory usage (RES)) 进程使用的物理内存百分比

    M: TIME+ = (CPU Time, hundredths) 进程使用的CPU时间总计,单位1/100秒

    b: PPID = (Parent Process Pid) 父进程Id

    c: RUSER = (Real user name)

    d: UID = (User Id) 进程所有者的用户id

    f: GROUP = (Group Name) 进程所有者的组名

    g: TTY = (Controlling Tty) 启动进程的终端名。不是从终端启动的进程则显示为 ?

    j: P = (Last used cpu (SMP)) 最后使用的CPU,仅在多CPU环境下有意义

    p: SWAP = (Swapped size (kb)) 进程使用的虚拟内存中,被换出的大小,单位kb

    l: TIME = (CPU Time) 进程使用的CPU时间总计,单位秒

    r: CODE = (Code size (kb)) 可执行代码占用的物理内存大小,单位kb

    s: DATA = (Data+Stack size (kb)) 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb

    u: nFLT = (Page Fault count) 页面错误次数

    v: nDRT = (Dirty Pages count) 最后一次写入到现在,被修改过的页面数

    y: WCHAN = (Sleeping in Function) 若该进程在睡眠,则显示睡眠中的系统函数名

    z: Flags = (Task Flags ) 任务标志,参考 sched.h

    X: COMMAND = (Command name/line) 命令名/命令行

    执行top -Hp PID,如 top -Hp 15477

    查看某进程中的线程  注:此时PID是线程id

    如线程15571有异常需要查看,使用jstack打印堆栈,查看线程15571状态(15571 16进制=3cd3)

    bb3e12d5a954bc916f01fd2035dcb61b.png

    二、jstack

    需要到JDK安装目录下使用(可通过ps x查看java进程,得到jdk安装目录)

    ./jstack PID(进程id)   ./jstack 15477

    红框中即为线程15571(16进制=3cd3) 状态

    f28b77fd3e90ab65d0c71dc253b3a71d.png

    分析jstack日志:

    94f15bcfb772222aa7290db836f73a97.png

    监视器Monitor:

    Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。

    每一个对象都有,也仅有一个 monitor。

    下面这个图,描述了线程和Monitor之间关系,以及线程的状态转换:

    f5748db880849f1fecbb970718954475.png

    进入区(Entrt Set):表示线程通过synchronized要求获取对象的锁。如果对象被锁住,则进入拥有者;否则在进入区等待。一旦对象锁被其他线程释放,立即参与竞争。

    拥有者(The Owner):表示某一线程成功竞争到对象锁。

    等待区(Wait Set):表示线程通过对象的object.wait()方法,释放对象的锁,并在等待区等待被唤醒。

    从图中可以看出,一个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 Active Thread,而其它线程都是 Waiting Thread,分别在两个队列 Entry Set和 Wait Set里面等候。

    在 Entry Set中等待的线程动作是 Waiting for monitor entry。

    在 Wait Set中等待的线程动作是 in Object.wait()。当一个线程申请进入临界区时,它就进入了 Entry Set队列。

    (我们称被 synchronized保护起来的代码段为临界区。当一个线程申请进入临界区时,它就进入了 “Entry Set ”队列)

    线程状态:

    NEW:未启动的。不会出现在Dump中。

    RUNNABLE:在虚拟机内执行的,运行中状态。The Owner区

    BLOCKED:受阻塞并等待监视器锁。在Entry Set区等锁。

    WATING:无限期等待另一个线程执行特定操作。在Wait Set区等待某个condition或monitor发生,一般停留在wait()等语句里。

    TIMED_WATING:有时限的等待另一个线程的特定操作。在WaitSet区和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。

    TERMINATED:已退出的。

    调用修饰

    表示线程在方法调用时,额外的重要的操作。修饰上方的方法调用。

    locked 目标:使用synchronized申请对象锁成功,监视器的拥有者。The Owner区。

    waiting to lock 目标:使用synchronized申请对象锁未成功,在Entry Set区等锁。线程状态为Blocked

    waiting on 目标:使用synchronized申请对象锁成功后,释放锁,在Wait Set区等锁。线程状态为WAITING或TIMED_WATING

    parking to wait for 目标:调用了park(),在Wait Set区,等待许可。

    (park是基本的线程阻塞原语,不通过监视器在对象上阻塞。

    park: 进入WAITING状态,对比wait不需要获得锁就可以让线程WAITING,通过unpark唤醒)

    线程动作

    线程状态产生的原因。

    runnable:The Owner区,状态RUNNABLE

    in Object.wait():调用wait(),Wait Set区,状态为WAITING或TIMED_WAITING,修饰waiting on

    waiting for monitor entry:等锁,Entry Set区,状态BLOCKED,修饰waiting to lock

    waiting on condition:因某种条件被park,Wait Set区,状态为parking to wait for

    sleeping:休眠的线程,调用了Thread.sleep()

    总结

    1、查看线程dump,先看线程状态/线程动作(比较直观),可以确定线程目前处于哪个阶段。然后看调用修饰及锁情况,基本就可以确定次线程是否有问题;

    2、可以短时间(可能有问题的时间段)内多次打印线程快照,然后查看可能有问题的某一线程在这几次的情况,可以有效查找问题。

    三、jps

    类似Linux命令ps

    ./jps

    b723390007d284ad69918cdf0e0cbea8.png

    ./jps -q

    e57ca623127295c09d7e6d01d45aa08f.png

    ./jps -m

    e2a7a847d20a7bd2341e814839e246dd.png

    ./jps -l

    fc317259900a772bf222bbed542d310b.png

    ./jps -v

    9236b9c7b68fa494631b26c0b1e42c3c.png

    四、jmap

    jmap -heap PID:堆使用情况

    jmap -histo PID:对象情况

    (jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息

    重点看项目上的类:[C是字符串数组,String用;[B是字节数组,网络层用到。这两个比较大一般没关系

    [C is a char[][S is a short[][I is a int[][B is a byte[][[I is a int[][]

    )

    展开全文
  • FTP账户同步分为两步,第一步将平台用户写入FTP服务器(FileZilla Server)配置文件中(Dom4J读写XML...在实际测试过程中,我们发现只有Administrator用户才能执行重启FTP服务,如果当前登录的不是Administrator用户...

    1前言

    **平台要求实现FTP账户同步。FTP账户同步分为两步,第一步将平台用户写入FTP服务器(FileZilla Server)配置文件中(Dom4J读写XML文件),第二部重启FTP服务(指令为net stop/strat “FileZilla Server”)。

    在实际测试过程中,我们发现只有Administrator用户才能执行重启FTP服务,如果当前登录的不是Administrator用户,即使该用户是管理员也不能执行重复FTP服务的操作。系统会提示:

    7ee4124bb5c643e7afa299edc9acf85f.png

    为解决该问题,需要对当前用户进行提权操作。本次调研了三种可行方案。

    2方案一PSTools(psexec)

    2.1简介

    pstools是sysinternals出的一个功能强大的nt/2k远程管理工具包。它的主页为下载地址为

    2.2Psexec指令说明

    psexec是一个远程执行工具,你可以像使用telnet一样使用它。它的使用格式为:psexec \\远程机器ip [-u username [-p password]] [-c [-f]] [-i][-d] program [arguments]它的参数有:-u后面跟用户名-p后面是跟密码的,如果建立ipc连接后这两个参数则不需要。(如果没有-p参数,则输入命令后会要求你输入密码)-c :拷贝文件到远程机器并运行(注意:运行结束后文件会自动删除)-d不等待程序执行完就返回,(比如要让远程机器运行tftp服务端的时候使用,不然psexec命令会一直等待tftp程序结束才会返回)-i在远程机器上运行一个名为psexesvc进程

    2.3使用说明

    将psexec.exe拷贝进工程下的指定目录

    在JAVA代码中用Runtime.getRuntime().exec()执行以下指令:指定目录/PsExec.exe -accepteula -u administrator –p密码net stop/strat “FileZilla Server”

    3方案二NIRCMD

    3.1简介

    NirCmd是一套免费的命令行指令,提供许多控制Windows的参数。让你运行命令行的方式,来执行一些常用的动作,例如开启或关闭光驱,增加或减少计算机音量。让你在执行一些常用的动作时,可以更加的有效率。

    3.2Elevate指令说明

    elevate [Program] {Command-Line Parameters}

    仅适用于Windows Vista/7/2008,以管理员权限运行。如果Program包含空格符,则需要用引号括起来。

    示例:

    elevate notepad.exe

    elevate notepad.exe C:\Windows\System32\Drivers\etc\HOSTS

    elevate "c:\program files\my software\abc.exe"

    3.3使用说明

    将nircmd.exe拷贝进工程下的指定目录

    在JAVA代码中用Runtime.getRuntime().exec()执行以下指令:指定目录/ nircmd.exe elevate net stop/strat “FileZilla Server”

    4方案三SUBINACL

    4.1简介

    Subinacl是提供的用于对文件、注册表、服务等对象进行权限管理的工具软件。

    官方下载地址:

    4.2Subinacl指令说明

    Subinacl的命令语法为:

    SUBINACL /SERVICE \\MachineName\ServiceName

    /GRANT=[DomainName\]UserName[=Access]

    运行此命令,用户必须具有管理员权限才能成功完成。

    如果省略MachineName,则假定为本地计算机。

    如果省略DomainName,在本地计算机帐户的搜索。

    可以对组进行授权。

    Access可以接受的值如下所示:

    F : Full Control

    R : Generic Read

    W : Generic Write

    X : Generic eXecute

    L : Read controL

    Q : Query Service Configuration

    S : Query Service Status

    E : Enumerate Dependent Services

    C : Service Change Configuration

    T : Start Service

    O : Stop Service

    P : Pause/Continue Service

    I : Interrogate Service

    U : Service User-Defined Control Commands

    4.3使用说明

    下载subinacl.msi

    安装subinacl.msi

    打开cmd,输入net config workstation,红圈中为当前登录的用户名“局域网_aaa”8fdc2f757b3040aab787f68c5291f81d.jpg

    切换用户,使用administrator用户登录

    打开cmd

    进入subinacl.msi安装目录下,默认为C:\Program Files (x86)\Windows Resource Kits\Tools

    执行指令Subinacl  /service  “FileZilla Server”  /grant=局域网_aaa=TO该指令意味着将FileZilla Server服务的启动和关闭权限赋给用户“局域网_aaa”

    切换用户,使用局域网_aaa登录,在cmd中执行net stop/Start “FileZilla Server”,可成功执行。

    5方案对比

    方案

    优点

    缺点

    方案一PSTools

    通用性较好,测试Win7,WinServer2008下均可实现服务重启

    程序需知道Administrator用户密码,有安全隐患。

    方案二NIRCMD

    Win7下可实现服务重启

    无需管理员密码

    WinServer2008弹框需输入Administrator密码,上线环境中不适用。

    方案三SUBINACL

    一次性配置,仅开放指定权限

    程序无需知道Administrator密码。

    较安全。

    需以administrator用户登录安装配置

    经过上述三种方案的比较,综合考虑,建议选择第三种方案。

    展开全文
  •  执行top命令: (查看进程15477的详细情况,下文用到) 系统信息(前五行): 第1行:Top 任务队列信息(系统运行状态及平均负载),与uptime命令结果相同。 第1段:系统当前时间,例如:16:07:37 第2段...

    一、top(Linux命令)

     执行top命令:    (查看进程15477的详细情况,下文用到)

    系统信息(前五行):

      • 第1行:Top 任务队列信息(系统运行状态及平均负载),与uptime命令结果相同。 
        • 第1段:系统当前时间,例如:16:07:37
        • 第2段:系统运行时间,未重启的时间,时间越长系统越稳定。 
          • 格式:up xx days, HH:MM
          • 例如:241 days, 20:11, 表示连续运行了241天20小时11分钟
        • 第3段:当前登录用户数,例如:1 user,表示当前只有1个用户登录
        • 第4段:系统负载,即任务队列的平均长度,3个数值分别统计最近1,5,15分钟的系统平均负载 
          • 系统平均负载:单核CPU情况下,0.00 表示没有任何负荷,1.00表示刚好满负荷,超过1侧表示超负荷,理想值是0.7;
          • 多核CPU负载:CPU核数 * 理想值0.7 = 理想负荷,例如:4核CPU负载不超过2.8何表示没有出现高负载。
      • 第2行:Tasks 进程相关信息 
        • 第1段:进程总数,例如:Tasks: 231 total, 表示总共运行231个进程
        • 第2段:正在运行的进程数,例如:1 running,
        • 第3段:睡眠的进程数,例如:230 sleeping,
        • 第4段:停止的进程数,例如:0 stopped,
        • 第5段:僵尸进程数,例如:0 zombie
      • 第3行:Cpus CPU相关信息,如果是多核CPU,按数字1可显示各核CPU信息,此时1行将转为Cpu核数行,数字1可以来回切换。 
        • 第1段:us 用户空间占用CPU百分比,例如:Cpu(s): 12.7%us,
        • 第2段:sy 内核空间占用CPU百分比,例如:8.4%sy,
        • 第3段:ni 用户进程空间内改变过优先级的进程占用CPU百分比,例如:0.0%ni,
        • 第4段:id 空闲CPU百分比,例如:77.1%id,
        • 第5段:wa 等待输入输出的CPU时间百分比,例如:0.0%wa,
        • 第6段:hi CPU服务于硬件中断所耗费的时间总额,例如:0.0%hi,
        • 第7段:si CPU服务软中断所耗费的时间总额,例如:1.8%si,
        • 第8段:st Steal time 虚拟机被hypervisor偷去的CPU时间(如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)
      • 第4行:Mem 内存相关信息(Mem: 12196436k total, 12056552k used, 139884k free, 64564k buffers) 
        • 第1段:物理内存总量,例如:Mem: 12196436k total,
        • 第2段:使用的物理内存总量,例如:12056552k used,
        • 第3段:空闲内存总量,例如:Mem: 139884k free,
        • 第4段:用作内核缓存的内存量,例如:64564k buffers
      •  第5行:Swap 交换分区相关信息(Swap: 2097144k total, 151016k used, 1946128k free, 3120236k cached) 
        • 第1段:交换区总量,例如:Swap: 2097144k total,
        • 第2段:使用的交换区总量,例如:151016k used,
        • 第3段:空闲交换区总量,例如:1946128k free,
        • 第4段:缓冲的交换区总量,3120236k cached

     进程信息:

      在top命令中按f按可以查看显示的列信息,按对应字母来开启/关闭列,大写字母表示开启,小写字母表示关闭。带*号的是默认列。

      • A: PID = (Process Id) 进程Id;
      • E: USER = (User Name) 进程所有者的用户名;
      • H: PR = (Priority) 优先级
      • I: NI = (Nice value) nice值。负值表示高优先级,正值表示低优先级
      • O: VIRT = (Virtual Image (kb)) 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
      • Q: RES = (Resident size (kb)) 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
      • T: SHR = (Shared Mem size (kb)) 共享内存大小,单位kb
      • W: S = (Process Status) 进程状态。D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程
      • K: %CPU = (CPU usage) 上次更新到现在的CPU时间占用百分比
      • N: %MEM = (Memory usage (RES)) 进程使用的物理内存百分比
      • M: TIME+ = (CPU Time, hundredths) 进程使用的CPU时间总计,单位1/100秒 
        b: PPID = (Parent Process Pid) 父进程Id 
        c: RUSER = (Real user name) 
        d: UID = (User Id) 进程所有者的用户id 
        f: GROUP = (Group Name) 进程所有者的组名 
        g: TTY = (Controlling Tty) 启动进程的终端名。不是从终端启动的进程则显示为 ? 
        j: P = (Last used cpu (SMP)) 最后使用的CPU,仅在多CPU环境下有意义 
        p: SWAP = (Swapped size (kb)) 进程使用的虚拟内存中,被换出的大小,单位kb 
        l: TIME = (CPU Time) 进程使用的CPU时间总计,单位秒 
        r: CODE = (Code size (kb)) 可执行代码占用的物理内存大小,单位kb 
        s: DATA = (Data+Stack size (kb)) 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb 
        u: nFLT = (Page Fault count) 页面错误次数 
        v: nDRT = (Dirty Pages count) 最后一次写入到现在,被修改过的页面数 
        y: WCHAN = (Sleeping in Function) 若该进程在睡眠,则显示睡眠中的系统函数名 
        z: Flags = (Task Flags <sched.h>) 任务标志,参考 sched.h
      • X: COMMAND = (Command name/line) 命令名/命令行

    参考  Linux性能分析工具top命令详解

     

    执行top -Hp PID,如 top -Hp 15477

    查看某进程中的线程  注:此时PID是线程id

    如线程15571有异常需要查看,使用jstack打印堆栈,查看线程15571状态(15571 16进制=3cd3)

    二、jstack

     参考 java命令--jstack 工具

        Java命令学习系列(二)——Jstack

      需要到JDK安装目录下使用(可通过ps x查看java进程,得到jdk安装目录)

      ./jstack PID(进程id)   ./jstack 15477

      红框中即为线程15571(16进制=3cd3) 状态

    分析jstack日志:

    监视器Monitor:

     Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。

    每一个对象都有,也仅有一个 monitor。

    下面这个图,描述了线程和Monitor之间关系,以及线程的状态转换:

    进入区(Entrt Set):表示线程通过synchronized要求获取对象的锁。如果对象被锁住,则进入拥有者;否则在进入区等待。一旦对象锁被其他线程释放,立即参与竞争。

    拥有者(The Owner):表示某一线程成功竞争到对象锁。

    等待区(Wait Set):表示线程通过对象的object.wait()方法,释放对象的锁,并在等待区等待被唤醒。

    从图中可以看出,一个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 Active Thread,而其它线程都是 Waiting Thread,分别在两个队列 Entry Set和 Wait Set里面等候。

    Entry Set中等待的线程动作是 Waiting for monitor entry

    在 Wait Set中等待的线程动作是 in Object.wait()当一个线程申请进入临界区时,它就进入了 Entry Set队列。

    (我们称被 synchronized保护起来的代码段为临界区。当一个线程申请进入临界区时,它就进入了 “Entry Set ”队列)

    线程状态:

    NEW:未启动的。不会出现在Dump中。

    RUNNABLE:在虚拟机内执行的,运行中状态。The Owner区

    BLOCKED:受阻塞并等待监视器锁。在Entry Set区等锁

    WATING:无限期等待另一个线程执行特定操作。在Wait Set区等待某个condition或monitor发生,一般停留在wait()等语句里。

    TIMED_WATING:有时限的等待另一个线程的特定操作。Wait Set区和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。

    TERMINATED:已退出的。

    调用修饰

    表示线程在方法调用时,额外的重要的操作。修饰上方的方法调用。

    locked <地址> 目标:使用synchronized申请对象锁成功,监视器的拥有者。The Owner区。

    waiting to lock <地址> 目标:使用synchronized申请对象锁未成功,在Entry Set区等锁。线程状态为Blocked

    waiting on <地址> 目标:使用synchronized申请对象锁成功后,释放锁,在Wait Set区等锁。线程状态为WAITING或TIMED_WATING

    parking to wait for <地址> 目标:调用了park(),在Wait Set区,等待许可。

     (park是基本的线程阻塞原语,不通过监视器在对象上阻塞。

      park: 进入WAITING状态,对比wait不需要获得锁就可以让线程WAITING,通过unpark唤醒)

    线程动作

    线程状态产生的原因。

    runnable:The Owner区,状态RUNNABLE

    in Object.wait():调用wait(),Wait Set区,状态为WAITING或TIMED_WAITING,修饰waiting on 

    waiting for monitor entry:等锁,Entry Set区,状态BLOCKED,修饰waiting to lock

    waiting on condition:因某种条件被park,Wait Set区,状态为parking to wait for

    sleeping:休眠的线程,调用了Thread.sleep()

    总结

    1、查看线程dump,先看线程状态/线程动作(比较直观),可以确定线程目前处于哪个阶段。然后看调用修饰及锁情况,基本就可以确定次线程是否有问题;

    2、可以短时间(可能有问题的时间段)内多次打印线程快照,然后查看可能有问题的某一线程在这几次的情况,可以有效查找问题。

     三、jps

    类似Linux命令ps 

    参考 Java命令学习系列(一)——Jps

    ./jps

     ./jps -q

    ./jps -m

    ./jps -l

    ./jps -v

     四、jmap

    参考  Java命令学习系列(三)——Jmap

             java命令--jmap命令使用

     jmap -heap PID:堆使用情况

    jmap -histo PID:对象情况

    (jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息

       重点看项目上的类:[C是字符串数组,String用;[B是字节数组,网络层用到。这两个比较大一般没关系

      [C is a char[]
      [S is a short[]
      [I is a int[]
      [B is a byte[]
      [[I is a int[][]

     

    转载于:https://www.cnblogs.com/hexinwei1/p/9556259.html

    展开全文
  • 3:ps命令将某个进程显示出来 grep命令是查找 中间的|是管道命令 是指ps命令与grep同时执行 ps -ef | grep 项目名 4:关闭进程 java kill -9 9436 5:不挂断运行命令,当账户退出或终端关闭时,程序仍然运行 nohup ...
  • 执行top命令: (查看进程15477的详细情况,下文用到) 系统信息(前五行): 第1行:Top 任务队列信息(系统运行状态及平均负载),与uptime命令结果相同。 第1段:系统当前时间,例如:16:07:37 第2段:系统运行...
  • 该脚本当前支持sh,bash和powershell,并且与exec样式命令执行兼容(例如java.lang.Runtime.exec)。 未登台: 上演: 对于其操作,脚本将我们要在目标服务器上运行的命令作为输入,并根据目标外壳对其进行转换...
  • 1.git远程仓库地址产生以及修改首先在cmd命令行执行heroku login需要注意的是,login命令默认会自动为你当前的主机创建SSH公钥并上传,SSH公钥非常重要,在你后面执行git push命令的时候是必须要用到的,不过不用...
  • 使用java向linux服务器端发送信号

    千次阅读 2014-02-18 10:37:34
    String signalStr; signalStr = "kill -" + “-9” + " " + “pid”;... // 返回与当前 Java 应用程序相关的运行时对象 try { Process p = run.exec(signalStr); // 启动另一个进程来执行命令 Buffer
  • java获取当前tomcat进程(linux)

    千次阅读 2016-12-23 13:35:26
    在某些时候我们需要取得tomcat进程号,然后通过进程号处理一些其他事务。那么在web项目中,如何通过某些方法取得当前tomcat服务器的pid?... 那么我们就可以得到执行我们java程序的当前pid。但是仔细想一下,执行jav
  • 当连接的远程服务器执行的时候,一旦关闭了当前终端,程序也被迫停止运行了。这显然是不行的 我想要的是让它常驻后台执行,不受启动其终端关闭与否的影响。 解决办法 在jar包文件所在的目录执行以下命令: nohup ...
  • 1.下载安装redis在远程服务器中你想下载的位置执行以下命令来下载redis文件到服务器中$ wget http://download.redis.io/releases/redis-4.0.9.tar.gz说明:$是指你的当前目录,不是命令的一部分,wget命令用来下载...
  • 解压安装jdk在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录,执行命令./jdk-6u14-linux-i586.bin这时会出现一段协议,连继敲回车,当询问是否同意的时候,输入yes,回车。之后会在当前目录下生成一个jdk...
  • 安装java将压缩包解压到指定目录配置环境变量(在当前用户下)5.安装tomcat将压缩包解压到指定目录配置环境变量(在当前用户下)6.运行jar包(执行main函数)执行默认main,可以在MANIFEST.MF文件中更改执行指定main...
  • 6) 连接成功后,用户可通过客户端命令行执行以下命令: [1] ls 服务器返回当前目录文件列表(<file/dir> name size) [2] cd <dir> 进入指定目录(需判断目录是否存在,并给出提示) [3] get <file> 通过UDP下载...
  • 再来装个Maven吧,反正东西不嫌多,只怕少。安装过程 1. 先去官网下载 Maven,我这里下载的以下这个版本的tar.gz包。 2. 放到自定义的目录下进行解压,... 解压完之后,执行以下命令,记录下当前maven路径地址,...
  • 首选要有一台云服务器,开始部署开发环境,还没有购买的同学,请移至阿里云官网选择,希望对你有所帮助! 如何选择配置请参阅阿里云服务器选择文档 准备工作 安装目录 创建如下路径/usr/...下载的目录为当前执行w
  • 接着搞搞 Nginx 的安装。安装过程 1. 老规矩,先去官网下载 Nginx,我下载下面的这个。  2. 将这个压缩包放到自定义的目录下,进行解压:tar -xvf nginx-1.12.1.tar.gz ... 执行以下命令,对当前文件夹赋
  • 然而很不巧,公司默认 %JAVA_HOME% 的JDK版本呢和当前应用所用的JDK版本不同,因此需要指定具体导入执行程序 导入命令 "C:\Program Files\Java\jdk1.8.0_101\bin\keytool.exe" -import -alias example_...
  • 但是一般情况下,不会执行关机操作,服务器会一直永无止境的运行 sync 将数据同步到硬盘中 shutdown 关机 2. 目录操作命令 ls 列出目录 添加-a参数,显示所有文件;-l参数显示文件的属性和权限 cd 切换目录 pwd 显示...
  •  在远程服务器中你想下载的位置执行以下命令来下载redis文件到服务器中  $ wget http://download.redis.io/releases/redis-4.0.9.tar.gz  说明:$是指你的当前目录,不是命令的一部分,wget命令用来下载网上...
  • 1. ps -aux 查看当前进程,整个列表最 后一列 COMMAND 会显示出启动服务的命令,如下图红框中部分。蓝框中是进程 Pid。 2.找到要关闭的服务进程。我要关闭jenkins这个服务,如下图黄框中行。 3. 杀死进程,...
  • 让其后台执行,否则没有pid生成 Linux 运行jar包命令如下: 方式一: [plain]view plaincopy java-jarXXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口...
  • 因为java大多是后台的,在服务器上跑,所以常常需要cmd命令,Process pro = Runtime.getRuntime.exec(cmd);获得cmd命令当前进程,然后再使用pro.waitFor();等待上面的cmd命令的结束,因为cmd命令可能是一个复制啥...
  • 举个栗子: 右键创建一个文本 以.sh结尾 ps -ef|grep java echo "user更新成功!" 执行 ./psJava.sh ...#用命令chmod 修改一下当前目录下的.sh权限就可以了 chmod u+x *.sh 再执行 ./psJava.sh就可以成功了 ...
  • 一、查看CPU 内存使用情况 命令列表:top top -Hp pid 1、topshfit+M 可以按内存使用大小排序p.s. top -Hp pid 查看进程下的线程使用情况2、如果是JAVA进程可使用 jps二、...xx.log把以下文件在linux服务器执行...
  • 环境变量,应用服务器WebSphere的路径也不同,所以没法 通用的设定一个jre路径来执行java -jar命令。 经过查阅JDK API后,发现System.getProperty(String)可以获得当前运行环境的JRE路径,从而解决了该问题。 该...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 256
精华内容 102
关键字:

java执行当前服务器命令

java 订阅