在Java中杀死进程的最佳方法是什么?
获取PID,然后使用Runtime.exec()
使用destroyForcibly()
?
这两种方法有什么区别,还有其他方法吗?
答案 0 :(得分:16)
如果您要杀死的进程已由您的应用启动
然后你可能会引用它(ProcessBuilder.start()
或Runtime.exec()
都返回引用)。在这种情况下,您只需拨打p.destroy()
即可。我认为这是最干净的方法(但要小心:p
启动的子流程可能会保持活跃状态,请查看http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092以获取更多信息。)
仅在destroyForcibly
在超时后失败时才应使用destroy()
。简而言之
destroy()
destroyForcibly()
将其终止
如果要杀死的进程是外部
然后您没有太多选择:您需要通过OS API(Runtime.exec
)。在Windows上,要调用的程序为taskkill.exe
,而在Mac和Linux上,您可以尝试kill
。
有关详细信息,请查看https://github.com/zeroturnaround/zt-exec/issues/19和Killing 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); 工作很好,因为它关闭了所有仍在运行的进程和组件