Java获取Process子进程进程ID方法详解
作者:初心JAVA 发布时间:2022-09-01 13:21:08
标签: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
来源:https://blog.csdn.net/xl_1803/article/details/127029387


猜你喜欢
- 本文实例讲述了C#中异步回调函数用法。分享给大家供大家参考。具体如下:static void Main(string[] args){ Fu
- 需要添加对 System.Management.dll 的引用 using System.Diagnostics; using System
- 1.本系统和现在有的考试系统有以下几种优势:a.和现在有的系统比较起来,本系统有科目、章节、老师、学生、班级等信息的管理,还有批阅试卷查看已
- 本文介绍了Android 仿微信自定义数字键盘的实现代码,分享给大家,希望对大家有帮助最终效果:实现这个自定义键盘的思路很简单:要写出一个数
- 1.定义Token的注解,需要Token校验的接口,方法上加上此注解import java.lang.annotation.ElementT
- 1、介绍官网地址:https://www.yuque.com/easyexcel特点:1、Java领域解析、生成Excel比较有名的框架有A
- 本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下实例:猜拳游戏猜拳游戏是指小时候玩的石头、剪刀、
- maven没有打包xml文件的问题最近使用maven带管理项目,采用SSM的技术栈,在配置好一些配置文件,打包部署到tomcat上,出现没有
- 在很多web产品中都需要实现在同一时刻,只能允许一个账号同时只能在一个浏览器当中登录。通俗点讲就是当A账号在浏览器1当中登录了,此时在浏览器
- Springboot 整合 RocketMQ 收发消息创建springboot项目pom.xml添加rocketmq-spring-boot
- 最近有学生做毕业设计,想使用悬浮窗这种效果,其实很简单,我们可以通过系统服务WindowManager来实现此功能,本章我们来试验一下在当前
- 使用AES算法可用于对数据进行加密码与解密,使用的时候需要注意两点:1)被加密的串越长,加密后的字符串越长,注意数据库字段的设计;2)Lin
- 在Android中,Handler是一个使用的非常频繁的东西,输入事件机制和系统状态,都通过Handler来进行流转,而在Handler中,
- 先看看目前这4种数据库的分页写法:-- OracleSELECT * FROM ( SELECT RO
- 本文实例为大家分享了Java实现宠物商店管理的具体代码,供大家参考,具体内容如下第一种实现方式:抽象类和对象数组public abstrac
- 前言本文主要给大家介绍了关于C#基础之Attribute和反射的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。A
- 整型变量基本语法格式int变量名= 初始值;代码示例int a = 10;int表示变量的类型是一个整型。在 Java 中, 一个int变量
- 本文实例讲述了Java实现打印二叉树所有路径的方法。分享给大家供大家参考,具体如下:问题:给一个二叉树,把所有的路径都打印出来。比如,对于下
- 网上的教程大都是手动通过protoc编译, 比较难用给当前工程添加"Google.Protobuf"和"Grp
- 什么是AOPAOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented P