最近写一个小程序扫描服务器上项目的启动情况时遇到一问题,就是当服务器多个项目启动时,进程中显示的都是javaw.exe,无法分辨哪个javaw.exe属于哪个项目,所以就想获取进程的路径,但是网上百度都只能获取到进程pid,无法得到进程路径,之后通过google搜到了如下一段代码:
/*1)、取当前进程ID*/
//9420@XMCX pid@计算机名
String pid = ManagementFactory.getRuntimeMXBean().getName();
//@之前为进程ID
pid = pid.substring(0, pid.indexOf('@'));
/*2)、根据进程ID取进程命令路径 D:\jdk1.6.0_18\bin\javaw.exe*/
Sigar sigar = new Sigar();//http://www.oschina.net/p/sigar
System.out.println(sigar.getProcExe(pid).getName());
System.out.println(sigar.getProcArgs(pid)[0]);
刚好同时在CSDN论坛中提问有位大神也回复使用Sigar可以实现,遂下了sigar的jar包,然后一番折腾,终于弄出来了。sigar.jar下载地址
具体实现代码如下:
1、先获取进程的pid,有两种方法:
第一种:
//tasklist:获取所有进程
String[] cmd = {"tasklist"};
try {
Process process = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String string_temp = "";
while ((string_temp = in.readLine()) != null) {
//在控制台中打印进程信息
System.out.println(string_temp);
if(string_temp.indexOf("进程名") != -1) {
//截取进程PID
String pid = string_temp.substring(12, string_temp.indexOf("Console")).trim();
Sigar sigar = new Sigar();
//获取进程路径
String processPath = sigar.getProcExe(pid).getName();
System.out.println("----进程路径:" + processPath);
}
}
} catch (Exception e) {
e.printStackTrace();
}
第二种:
//获取当前进程的信息
String name = ManagementFactory.getRuntimeMXBean().getName();
//截取进程id
String pid = name.substring(0, name.indexOf("@"));
Sigar sigar = new Sigar();
try {
//获取进程路径
String processPath = sigar.getProcExe(pid).getName();
System.out.println("进程路径:" + processPath );
} catch (SigarException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
另外,Sigar包很强大,可以获取各种系统信息,大家可以去doc里面去看
对了,在导jar包的时候要顺带把“sigar-amd64-winnt.dll”或者“sigar-x86-winnt.dll”放到项目的根目录下。
来源:CSDN
作者:Eagle昊
链接:https://blog.csdn.net/zhang41228/article/details/74992308