从另一个 Java 应用程序中查找并终止特定的 Java 进程

Posted

技术标签:

【中文标题】从另一个 Java 应用程序中查找并终止特定的 Java 进程【英文标题】:Find and kill a specific Java process from another Java App 【发布时间】:2013-04-17 22:30:02 【问题描述】:

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

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

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

更新 2:我无法安装非 java 程序。

【问题讨论】:

见this thread和关于jps的第二个答案。 wmic 方式可能也会起作用。将此标记为重复... @eis 并不是真正的重复,因为这个问题询问如何从另一个 Java 应用程序执行此操作,而另一个线程完全是关于使用操作系统工具来执行此操作 我最终只使用了一堆拼凑在一起的操作系统命令以及 ProcessBuilder 和 Runtime.exec 的混搭。正如 eis 建议的那样,我们应该把它当作一个骗子来关闭。 【参考方案1】:

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


也许可以使用Attach API 独立完成这个平台。这是 JDK 自带的,所以要使用它,只需在程序的类路径中包含 JDK 中的 tools.jar

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

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

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

这些链接也可能有帮助:

An Oracle blog on the attach API

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

【讨论】:

谢谢。我确实最终使用了诸如 WMIC 和 TASKKILL 之类的命令,但这非常简洁——我不知道您可以获取有关其他正在运行的 VM 的信息。 +1 教我一些新东西。 在与并非总是有效的命令(取决于管理员/访客设置和其他问题)苦苦挣扎之后,我最终使用了 Attach API。谢谢!【参考方案2】:

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

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

启动“MyProgramName”java java-program..

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

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

taskkill /fi "MyProgramName"

您的 Java 程序只会被终止。休息不受影响。

【讨论】:

我喜欢这个答案,但在使用 Java ProcessBuilder 时似乎无法设置“别名”。

以上是关于从另一个 Java 应用程序中查找并终止特定的 Java 进程的主要内容,如果未能解决你的问题,请参考以下文章

从另一个应用程序打开 TestFlight 应用程序并深层链接到特定应用程序

在特定时间安排顶部/终止 Java 程序

从表中选择数据并从另一个表中填充特定值

c语言下如何用正则或者字符串查找匹配特定字符串并提取出来

从另一个 Dataframe 中的一个 Dataframe 中查找元素并返回其索引的快速方法

sql 在特定表上查找锁定会话并将其终止。