[英]The right way to kill a process in Java
在 Java 中终止进程的最佳方法是什么?
获取 PID 然后用Runtime.exec()
杀死它?
使用destroyForcibly()
?
这两种方法有什么区别,还有其他解决方案吗?
如果您要杀死的进程已由您的应用程序启动
然后你可能有一个引用它( ProcessBuilder.start()
或Runtime.exec()
都返回一个引用)。 在这种情况下,您只需调用p.destroy()
。 我认为这是最干净的方式(但要小心: p
启动的子流程可能会保持活跃状态,请查看http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092获取更多信息)。
只有在某个超时后destroy()
失败时才应使用destroyForcibly
。 简而言之
destroy()
终止进程 destroyForcibly()
其杀死 如果要杀死的进程是外部的
那么你没有太多选择:你需要通过OS API( Runtime.exec
)。 在Windows上,要调用的程序将是taskkill.exe
,而在Mac和Linux上,您可以尝试kill
。
看看https://github.com/zeroturnaround/zt-exec/issues/19并使用Java和http://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app- 杀死一个进程 kill-any-process-after-specified-time-0133513 /获取更多信息。
如果你试图杀死java代码启动的主进程,我建议使用System.exit()
。 这里解释了这些好处: 我们何时应该在java中调用system exit 。
从本质上讲, System.exit()
将运行关闭挂钩,以确保在您的进程被终止之前,任何可能尚未完成其工作的从属非守护进程被杀死。 这是干净的方法。
如果该过程不属于您,则必须依赖操作系统为您完成此工作,如本答案中所述: 使用Java杀死进程
在这种情况下,你建议Runtime.exec()
杀死* nix将是一个不错的方式。
现在和destroyForcibly()
,你通常会在你的java代码生成的子进程上调用它,这个代码可能是从进程api的ProcessBuilder.start()
或Runtime.exec()
Java 9 引入了公开.destroy()和.destroyForcibly()方法的ProcessHandle 。
长话短说:
如果您知道进程 ID (pid),则使用“ .of ”:
ProcessHandle.of(pid).destroy();
否则采取以下步骤:
destroy
方法之一。对我有用的是System.exit(0); 它的工作很好,因为它关闭了所有仍在运行的进程和组件
在java 8源代码中
public Process destroyForcibly() {
destroy();
return this;
}
我只想说destroyForcibly
等于Java 8中的destroy
。
因此,如果在调用destroy
方法后进程仍处于活动状态,则应尝试使用pid终止进程。 如果你使用的是java 9 +,只需调用Process.pid()
方法即可轻松获取pid。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.