我有几个java进程在Windows机器上运行。我有一个 Java 进程,它应该监视其他进程并定期终止或重新启动新进程。
如果我有一个运行 com.foo.Main1 的 java 进程和一个运行 com.foo.Main2 的 java 进程 - 我的监控进程如何找到并杀死 Main2 进程?
更新:我有一些代码可以执行命令行tasklist.exe并解析它,但无论我做什么,我只看到java.exe进程,而不是哪个类正在执行
更新 2:我无法安装非 java 程序。
最佳答案
使用特定于操作系统的工具并使用 Runtime.exec() 来运行它们可能会简单得多,但我会尝试给出一个独立于平台的答案:
使用 Attach API 独立构建这个平台是可能的。 。它随 JDK 一起提供,因此要使用它,只需将 JDK 中的 tools.jar
包含在程序的类路径中即可。
要获取系统上的虚拟机列表,请使用 VirtualMachine.list() 。您可以从由此返回的虚拟机描述符对象获取/解析参数。
附加 API 还允许您将代理加载到已经运行的 Java 进程中。由于您想终止 Java 进程,因此可以编写一个仅运行 System.exit() 的 Java 代理。 (或者,如果您真的希望它死掉,请使用 Runtime.halt() 代替)代理加载时。
一旦你确定了你想要杀死的人,attach并加载 killer 代理(代理必须构建为 JAR 文件,可供需要加载的 Java 进程访问)。代理连接后不久,该进程就会终止。
这些链接也可能有帮助:
An Oracle blog on the attach API
Package documentation for java.lang.instrument (有关于如何构建代理 JAR 的详细说明)
关于java - 从另一个 Java 应用程序中查找并终止特定的 Java 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16071354/