从另一个Java App查找并终止特定的Java进程

时间:2013-04-17 22:30:03

标签: java windows taskmanager

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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


可以使用Attach API独立完成此平台。这与JDK一起提供,因此要使用它只需在您的程序的类路径中包含JDK中的tools.jar

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

attach API还允许您将代理加载到已经运行的Java进程中。由于您想要终止Java进程,因此您可以编写一个只运行System.exit()的Java代理(或者当代理加载时确实希望它不再使用Runtime.halt()

一旦确定要杀死的那个,attach并加载杀手代理(代理必须构建为JAR文件,可以访问需要加载的Java进程)。在附加代理之后不久,该过程就会死亡。

这些链接也可能有所帮助:

An Oracle blog on the attach API

Package documentation for java.lang.instrument(有关于如何构建代理JAR的详细说明)

答案 1 :(得分:1)

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

所以我使用:

运行相同的java程序

启动“MyProgramName”java java-program ..

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

现在要使用这个java程序来使用以下taskkill命令:

taskkill / fi“MyProgramName”

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