Java 代码 - 在 localhost JVM 中列出 Java 进程的最佳方式适用于 Linux 和 Windows

问题描述

我正在编写一个可以在 Linux 和 Windows 系统中运行的控制台应用程序。此应用将主要在 JRE 1.8 环境中运行。

在我的代码中,它需要获取在运行我的应用程序的主机上运行的 Java 进程列表。我已经阅读了关于 jps 的帖子,它是 JDK 的一部分,但不是 JRE,而且它是一个单独的可执行文件

我的问题是,是否有任何我可以使用的 Java 库来列出(最好还杀死一些)正在运行的 Java 进程?最好,我不想像 Runtime.exec() 那样麻烦地调用 jps 可执行文件

在此先感谢您的建议。

解决方法

糟糕:我刚刚发现您需要 JRE1.8 的解决方案,这只对 JRE9+ 有帮助。

在 JRE 中扫描进程的一种简单方法是使用 ProcessHandle.allProcesses()。这将读取所有进程,您可以在与“java”或“java.exe”匹配的简单名称上添加过滤器:

Path java = Path.of("bin","java.exe");  // use "java" if not on Windows

ProcessHandle.allProcesses()
             .filter(ph -> ph.info().command().isPresent())
             .filter(ph -> Path.of(ph.info().command().get()).endsWith(java))
             .forEach(ph -> {
                 System.out.println("PID "+ph.pid()+" "+ph.info().command());
})

这种方法不会发现嵌入在 EXE 中的 Java 虚拟机 - 例如来自 jpackage - 所以不如使用 JDK jps 可靠,它可以识别 jpackage EXE 和 JDK 工具,例如jshell.exe

,

我终于找到了名为 Oshi 的 3rd 方库,它显然不需要 JDK 并且兼容 Java 1.8:https://github.com/oshi/oshi

为了将来参考,这里是一个示例方法:

public static List<OSProcess> getOSProcesses() {
    SystemInfo si = new SystemInfo();
    OperatingSystem os = si.getOperatingSystem();
    return os.getProcesses();
}