我在Windows机器上运行了几个java进程。我有一个Java进程,它应该监视其他进程并定期终止或重新启动新进程。
如果我有一个运行com.foo.Main1的java进程和一个运行com.foo.Main2的进程 - 我的监控进程如何找到并杀死Main2进程?
更新:我有一些代码可以执行命令行tasklist.exe并解析它,但无论我做什么,我只看到java.exe进程,而不是正在执行哪个类
更新2:我没有能力安装非java程序。
答案 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程序只会被杀死。休息将不受影响。