Java如何获取Process子进程的进程ID?
原创
©著作权归作者所有:来自51CTO博客作者wx5df643be5259a的原创作品,请联系作者获取转载授权,否则将追究法律责任
java可以通过Runtime.getRuntime().exec()执行一个操作系统的命令,在操作系统层面执行命令也就创建了一个进程,Java中用Process类表示进程,如何获取进程ID呢?Process是一个抽象类,然后它并没有直接为我们提供获取进程ID的属性或方法。
下面来介绍一下在两种最常用的操作系统(windows、linux)上用Java执行本地命令后,如何获取对应的进程ID。
windows上获取pid
首先引入如下依赖。
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.12.1</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.12.1</version>
</dependency>
示例代码如下。
Process p = Runtime.getRuntime().exec("ping -n 1000 localhost");
Field f = p.getClass().getDeclaredField("handle");
f.setAccessible(true);
long handle = f.getLong(p);
Kernel32 kernel = Kernel32.INSTANCE;
WinNT.HANDLE winntHandle = new WinNT.HANDLE();
winntHandle.setPointer(Pointer.createConstant(handle));
int pid = kernel.GetProcessId(winntHandle);
System.out.println("进程id="+pid);
InputStream in = p.getInputStream();
byte[] b = new byte[1024];
int len = -1;
try {
while (true) {
len = in.read(b);
System.out.print(new String(b, 0, len, "GBK"));
Thread.sleep(1000L);
}
} catch (Exception e) {
e.printStackTrace();
}
运行后,控制台输出如下图所示。
下面验证一下8264是不是ping命令的进程ID。
方式一:通过任务管理器。
方式二:通过tasklist命令
linux上获取pid
当放到linux操作系统上运行的时候,Process的实现为java.lang.UNIXProcess,该类有一个int类型的属性pid,就是我们要的进程ID。这里我就不演示了,直接上代码。
Process p = Runtime.getRuntime().exec("ping -c 1000 localhost");
Field pid = p.getClass().getDeclaredField("pid");
pid.setAccessible(true);
System.out.println(pid.getInt(p));
怎么验证呢?可以用如下命令: