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

标签 java windows taskmanager

我有几个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/

相关文章:

java - 字符串检查 while 循环无法正常工作

java - OpenMQ 和 JMX - 是否可以查询消息?

windows - 自动 Samba 共享脚本

c# - 如何在任务管理器中拥有不同的进程名称(当前进程)名称?

java - 任务管理器及其与 Java 进程的相关性

android - SharedPreferences 不会在 PreferenceActivity 中保存/加载

java - react 堆重试不调用要重试的方法

java - JFileChooser 的 Windows 外观

Windows SSH 要求输入密码

windows - OpenCV 视频编写器 H264 编解码器 (ffmpeg)