java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java获取Process子进程

Java获取Process子进程进程ID方法详解

作者:初心JAVA

这篇文章主要介绍了Java获取Process子进程进程ID方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

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命令

tasklist | findstr 8264

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));

怎么验证呢?可以用如下命令:

ps -aux|grep ping

到此这篇关于Java获取Process子进程进程ID方法详解的文章就介绍到这了,更多相关Java获取Process子进程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文