如何解决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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。