2

我有几个在 Windows 机器上运行的 java 进程。我有一个 Java 进程,它应该监视其他进程并定期终止或重新启动新进程。

如果我有一个运行 com.foo.Main1 的 java 进程和一个运行 com.foo.Main2 的 java 进程 - 我的监控进程如何才能找到并杀死 Main2 进程?

更新:我有一些代码可以执行命令行 tasklist.exe 并解析它,但无论我做什么,我只看到 java.exe 进程,而不是执行哪个类

更新 2:我没有能力安装非 java 程序。

4

2 回答 2

2

使用特定于操作系统的工具并用于运行它们可能会简单得多Runtime.exec(),但我会尝试给出一个独立于平台的答案:


可以使用Attach API独立地执行此平台。这是 JDK 自带的,所以要使用它,只需tools.jar将 JDK 包含在程序的类路径中即可。

要获取系统上的虚拟机列表,请使用VirtualMachine.list()。您可以从由此返回的虚拟机描述符对象中获取/解析参数。

附加 API 还允许您将代理加载到已经运行的 Java 进程中。由于您想杀死一个 Java 进程,您可以编写一个 Java 代理,它在代理加载时只运行System.exit()(或者如果您真的希望它停止运行,请使用Runtime.halt()代替)。

一旦您确定了要杀死的那个,附加到它并加载杀手代理(代理必须构建为 JAR 文件,可供需要加载的 Java 进程访问)。附加代理后不久,该进程应该终止。

这些链接也可能有帮助:

关于附加 API 的 Oracle 博客

java.lang.instrument 的包文档(有关于如何构建代理 JAR 的详细说明)

于 2013-04-18T04:52:39.577 回答
1

这是特定于 Windows 的。我遇到了同样的问题,我必须使用 taskkill 杀死特定的 java 程序。当我运行 java 程序时,tasklist 显示图像名称设置为 java.exe 的相同程序。但是使用 taskkill /F java.exe 杀死它会停止所有其他 Java 应用程序,而不是不需要的预期应用程序。

所以我使用以下方法运行相同的 java 程序:

启动“MyProgramName”java java-program..

这里的启动命令将打开一个新窗口并运行窗口标题设置为 MyProgramName 的 java 程序。

现在要杀死这个 java 程序,请使用以下 taskkill 命令:

taskkill /fi "我的程序名"

您的 Java 程序只会被杀死。休息不受影响。

于 2014-01-08T10:16:36.670 回答