【发布时间】:2010-12-10 14:25:59
【问题描述】:
我需要从另一个程序中(强制)关闭特定的 Java 应用程序。对于任何本机程序杀死它的进程或将 vm_close 发送到它的主窗口通常都可以工作,但对于在 Windows 上运行的 Java 应用程序来说,效果并不好。请注意,Java 应用程序仅显示托盘图标,并且在正常状态下没有打开窗口。
【问题讨论】:
我需要从另一个程序中(强制)关闭特定的 Java 应用程序。对于任何本机程序杀死它的进程或将 vm_close 发送到它的主窗口通常都可以工作,但对于在 Windows 上运行的 Java 应用程序来说,效果并不好。请注意,Java 应用程序仅显示托盘图标,并且在正常状态下没有打开窗口。
【问题讨论】:
如果您知道 Java 程序的 PID,请使用:
Runtime.getRuntime().exec("taskkill /F /PID bla");
bla 是您程序的 PID。
/F 参数将强制终止应用程序,我看不出 Java 程序与其他程序有什么不同并且能够幸存下来的原因。
请注意,此代码显然是特定于 Windows 的。如果您希望它是可移植的,您应该首先通过使用找出哪个操作系统托管您的应用程序
System.getProperty("os.name")
然后,如果您使用的是 Windows,请使用 taskkill /F,或者如果您使用的是 *nix 系统,请使用 kill -9,或者如果您使用的是更奇特的平台,请使用其他东西。
更新:要对所有正在运行的进程有一个很好的了解,我推荐Process explorer。如果你想要一个命令行进程列表,使用PsList。
如果你想杀死一个特定的 Java 程序,这可能会有问题,因为默认情况下每个 Java 进程都被命名为 java.exe 或 javaw.exe。
使用 PsList,您可以以编程方式扫描所有以java 开头的进程,然后结合jps,您将获得有关您真正想要杀死的更多信息。
【讨论】:
一个简单的技巧是复制/粘贴 java.exe(或 javaw.exe)的第二个版本,将其命名为 java_alt.exe,然后使用 Unix Tools for windows 以新名称终止进程
【讨论】:
如果您将 java 应用程序的进程 ID 写入已知位置的临时文件会怎样。当程序启动时,执行以下操作:
//mark the instance file for delete
String instanceFileLocation = System.getProperty("java.io.tmpdir") + File.separator + "instances.dat";
File PIDFile = new File(instanceFileLocation).deleteOnExit();
//write the process id here
然后任何程序或应用程序都可以找到临时文件和特定的进程 ID。使用发布的其他解决方案杀死它。
然后使用
【讨论】: