用Java杀死进程的正确方法

时间:2016-02-05 17:54:02

标签: java process kill runtime.exec destroy

在Java中杀死进程的最佳方法是什么?

获取PID,然后使用Runtime.exec()

将其删除

使用destroyForcibly()

这两种方法有什么区别,还有其他方法吗?

4 个答案:

答案 0 :(得分:16)

如果您要杀死的进程已由您的应用启动

然后你可能会引用它(ProcessBuilder.start()Runtime.exec()都返回引用)。在这种情况下,您只需拨打p.destroy()即可。我认为这是最干净的方法(但要小心:p启动的子流程可能会保持活跃状态​​,请查看http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092以获取更多信息。)

仅在destroyForcibly在超时后失败时才应使用destroy()。简而言之

  1. 使用destroy()
  2. 终止流程
  3. 允许进程以合理的超时正常退出
  4. 如果进程是,则
  5. 使用destroyForcibly()将其终止
  6. 如果要杀死的进程是外部

    然后您没有太多选择:您需要通过OS API(Runtime.exec)。在Windows上,要调用的程序为taskkill.exe,而在Mac和Linux上,您可以尝试kill

    有关详细信息,请查看https://github.com/zeroturnaround/zt-exec/issues/19Killing a process using Java以及http://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app-kill-any-process-after-specified-time-0133513/

答案 1 :(得分:6)

如果你试图杀死你的java代码开始的主要进程,我建议使用System.exit()。这里解释了这些好处:when should we call system exit in java

基本上,System.exit()将运行关闭挂钩,以确保在您的进程被终止之前,任何可能尚未完成其工作的从属非守护进程被杀死。这是干净的方法。

如果该过程不属于您,则您将不得不依赖操作系统为您完成此工作,如本答案中所述:Killing a Process Using Java

在这种情况下,你建议Runtime.exec()杀死* nix将是一个不错的方式。

现在,对于destroyForcibly(),您通常会在由您的java代码生成的子进程上调用该进程,该代码可能是以进程api的ProcessBuilder.start()或{{}开始的。 {1}}

答案 2 :(得分:1)

在Java 8源代码中

public Process destroyForcibly() {
    destroy();
    return this;
}

感谢您的建议,对不起我的英语。
我只想说destroyForcably等于Java 8中的destroy
因此,如果在调用destroy方法后进程仍然存在,则应尝试通过pid杀死该进程。
如果您使用的是Java 9+,则可以轻松获取pid,只需调用Process.pid()方法

答案 3 :(得分:0)

最适合我的是System.exit(0); 工作很好,因为它关闭了所有仍在运行的进程和组件