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

 更新时间:2022年12月30日 10:45:37   作者:初心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子进程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring AOP中使用args表达式的方法示例

    Spring AOP中使用args表达式的方法示例

    这篇文章主要介绍了Spring AOP中使用args表达式的方法,结合实例形式分析了spring面向切面AOP中使用args表达式具体步骤、相关实现技巧与操作注意事项,需要的朋友可以参考下
    2020-01-01
  • Java超详细分析讲解哈希表

    Java超详细分析讲解哈希表

    哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方,说起来可能感觉有点复杂,我想我举个例子你就会明白了,最典型的的例子就是字典
    2022-06-06
  • Java使用Arrays.sort()方法实现给对象排序

    Java使用Arrays.sort()方法实现给对象排序

    这篇文章主要介绍了Java使用Arrays.sort()方法实现给对象排序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • C#创建Web应用程序代码实例

    C#创建Web应用程序代码实例

    本文主要通过实例代码介绍了C#创建Web应用程序,需要的朋友可以参考下
    2017-04-04
  • 使用fileupload组件实现文件上传功能

    使用fileupload组件实现文件上传功能

    这篇文章主要为大家详细介绍了使用fileupload实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 使用java对一副扑克牌建模

    使用java对一副扑克牌建模

    这篇文章主要为大家详细介绍了如何使用java对一副扑克牌建模,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Jmeter逻辑控制器事务控制器使用方法解析

    Jmeter逻辑控制器事务控制器使用方法解析

    这篇文章主要介绍了Jmeter逻辑控制器事务控制器使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Java实现调用外部程序的示例代码

    Java实现调用外部程序的示例代码

    本文主要介绍了Java实现调用外部程序的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Spring的@Transactional嵌套解读

    Spring的@Transactional嵌套解读

    本文通过详细测试,探究了Spring的@Transactional注解在事务嵌套和局部回滚场景下的行为表现,文中通过多个测试案例,阐述了不同传播行为(如REQUIRES_NEW)对事务嵌套处理的影响,以及rollbackFor属性在异常管理中的作用和限制,通过实验总结
    2024-11-11
  • 浅析Java的Hibernate框架中的继承关系设计

    浅析Java的Hibernate框架中的继承关系设计

    这篇文章主要介绍了Java的Hibernate框架中的继承关系设计,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12

最新评论