Java程序如何获得自己的进程ID?
时间:2020-03-05 18:45:24 来源:igfitidea点击:
如何获取Java进程的ID?
我知道有几种与平台有关的黑客,但是我希望有一个更通用的解决方案。
解决方案
回答
没有可以保证在所有jvm实现中都可以使用的与平台无关的方式。ManagementFactory.getRuntimeMXBean()。getName()
看起来是最好的(最近的)解决方案。它很短,可能在广泛使用的每个实现中都有效。
在linux + windows上,它返回一个类似于12345 @ hostname
的值(12345
是进程ID)。但是请注意,根据文档,并不能保证该值:
Returns the name representing the running Java virtual machine. The returned name string can be any arbitrary string and a Java virtual machine implementation can choose to embed platform-specific useful information in the returned name string. Each running virtual machine could have a different name.
在Java 9中,可以使用新的流程API:
long pid = ProcessHandle.current().pid();
回答
这取决于我们从哪里寻找信息。
如果要从控制台中查找信息,则可以使用jps命令。该命令给出的输出类似于Unix ps命令,并且随JDK一起提供,因为我相信1.5
如果我们从流程中查找,则RuntimeMXBean(如Wouter Coekaerts所说)可能是最佳选择。 Windows上使用Sun JDK 1.6 u7的getName()的输出格式为[PROCESS_ID] @ [MACHINE_NAME]。但是,我们可以尝试执行jps并从中解析结果:
String jps = [JDK HOME] + "\bin\jps.exe"; Process p = Runtime.getRuntime().exec(jps);
如果不带选项运行,则输出应为进程ID,后跟名称。
回答
我们可以签出我的项目:GitHub上的JavaSysMon。它提供了进程ID和跨平台(目前为Windows,Mac OSX,Linux和Solaris)的其他功能(CPU使用率,内存使用率)
回答
尝试Sigar。非常广泛的API。 Apache 2许可证。
private Sigar sigar; public synchronized Sigar getSigar() { if (sigar == null) { sigar = new Sigar(); } return sigar; } public synchronized void forceRelease() { if (sigar != null) { sigar.close(); sigar = null; } } public long getPid() { return getSigar().getPid(); }