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子进程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java 多线程同步 锁机制与synchronized深入解析
从尺寸上讲,同步代码块比同步方法小。你可以把同步代码块看成是没上锁房间里的一块用带锁的屏风隔开的空间2013-09-09Java并发(Runnable+Thread)实现硬盘文件搜索功能
这篇文章主要介绍了Java并发(Runnable+Thread)实现硬盘文件搜索,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-01-01
最新评论