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

作者:初心JAVA 时间:2022-09-01 13:21:08 

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

运行后,控制台输出如下图所示。

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

下面验证一下8264是不是ping命令的进程ID。

方式一:通过任务管理器。

Java获取Process子进程进程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

来源:https://blog.csdn.net/xl_1803/article/details/127029387

标签:Java,Process,子进程,ID
0
投稿

猜你喜欢

  • java中的控制结构(if,循环)详解

    2022-05-13 19:18:59
  • Unity3D自定义创建圆锥体

    2022-05-04 10:12:34
  • 详解Java设计模式——命令模式

    2023-11-23 05:00:07
  • Java+element实现excel的导入和导出

    2022-07-31 12:45:53
  • Netty分布式pipeline管道异常传播事件源码解析

    2021-08-15 16:12:02
  • C#中缓存的基本用法总结

    2023-12-06 01:22:45
  • Java中的zookeeper常用命令详解

    2022-12-07 05:46:35
  • 浅谈java对象结构 对象头 Markword

    2023-04-26 04:50:34
  • SpringBoot利用限速器RateLimiter实现单机限流的示例代码

    2023-04-05 19:57:50
  • 浅析SpringBoot2.4 静态资源加载问题

    2023-01-29 11:04:33
  • java实现给图片加铺满的网格式文字水印

    2023-07-30 05:22:12
  • SpringBoot实现接口数据的加解密功能

    2023-06-30 00:11:01
  • Spring Boot FeignClient 如何捕获业务异常信息

    2022-01-26 11:57:41
  • java面试try-with-resources问题解答

    2023-09-03 15:08:01
  • Android 中通过实现线程更新Progressdialog (对话进度条)

    2023-04-16 14:57:50
  • Spring MVC全局异常实例详解

    2021-11-19 13:51:26
  • java实现双色球彩票游戏

    2022-06-29 12:39:45
  • C#中foreach语句使用break暂停遍历的方法

    2022-10-12 20:14:11
  • Spring Security过滤器链体系的实例详解

    2023-08-25 03:24:15
  • Java Thread之Sleep()使用方法及总结

    2023-11-16 10:38:35
  • asp之家 软件编程 m.aspxhome.com