Java 代码 - 在本地主机 JVM 中列出 java 进程的最佳方式(对于 Linux & Windows]
Java code - Best way to list java processes in localhost JVM (for Linux & Windows]
我正在编写一个控制台应用程序,它将 运行 在 Linux 和 Windows 系统中。此应用主要 运行 JRE 1.8 环境。
在我的代码中,它需要获取 运行 在我的应用程序主机 运行 上的 Java 个进程的列表。我已经阅读了关于 jps 的帖子,它是 JDK 的一部分,但不是 JRE,而且它是一个单独的可执行文件。
我的问题是,有没有我可以使用的 java 库来列出(最好也杀死一些)运行ning 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());
})
这种方法不会发现 Java 嵌入在 EXE 中的 VM - 例如来自 jpackage
- 因此不如使用 JDK jps
那样可靠,它确实识别jpackage
个 EXE 和 JDK 个工具,例如 jshell.exe
。
我终于找到了名为 Oshi 的第 3 方库,它显然不需要 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();
}
我正在编写一个控制台应用程序,它将 运行 在 Linux 和 Windows 系统中。此应用主要 运行 JRE 1.8 环境。
在我的代码中,它需要获取 运行 在我的应用程序主机 运行 上的 Java 个进程的列表。我已经阅读了关于 jps 的帖子,它是 JDK 的一部分,但不是 JRE,而且它是一个单独的可执行文件。
我的问题是,有没有我可以使用的 java 库来列出(最好也杀死一些)运行ning 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());
})
这种方法不会发现 Java 嵌入在 EXE 中的 VM - 例如来自 jpackage
- 因此不如使用 JDK jps
那样可靠,它确实识别jpackage
个 EXE 和 JDK 个工具,例如 jshell.exe
。
我终于找到了名为 Oshi 的第 3 方库,它显然不需要 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();
}