繁体   English   中英

Java中杀死进程的正确方法

[英]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 简而言之

  1. destroy()终止进程
  2. 允许进程在合理的超时时间内正常退出
  3. 如果进程仍然存在,则使用destroyForcibly()其杀死

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

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


看看https://github.com/zeroturnaround/zt-exec/issues/19使用Javahttp://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();

否则采取以下步骤:

  1. 使用ProcessHandle.allProcesses()列出所有当前正在运行的进程
  2. .info()检查它们
  3. 使用上面提到的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM