用Java杀死进程的正确方法

问题描述 投票:15回答:4

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

获取PID然后用Runtime.exec()杀死它?

使用destroyForcibly()

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

java process kill runtime.exec destroy
4个回答
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. 如果进程还活着,用destroyForcibly()杀死它

如果要杀死的进程是外部的

那么你没有太多选择:你需要通过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/


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()Runtime.exec()开始的。


1
投票

在java 8源代码中

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

谢谢你的建议,对不起我的英语。 我只想说destroyForccibly等于Java 8中的destroy 因此,如果在调用destroy方法后进程仍然存在,则应尝试使用pid终止进程 如果你使用java 9 +,你可以轻松获得pid,只需调用Process.pid()方法


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.