在Java中杀死进程的正确方法

2022-09-03 00:38:04

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

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

用?destroyForcibly()

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


答案 1

如果要终止的进程已由应用程序启动

然后,您可能有对它的引用(或两者都返回引用)。在这种情况下,您只需调用 .我认为这是最干净的方式(但要小心:启动的子进程可能会保持活动状态,请检查Process.destroy不会杀死多个子进程以获取更多信息)。ProcessBuilder.start()Runtime.exec()p.destroy()p

仅当在特定超时后失败时才应使用 。简而言之destroyForciblydestroy()

  1. 终止进程destroy()
  2. 允许进程以合理的超时正常退出
  3. 如果进程仍然有效,则将其杀死destroyForcibly()

如果要终止的进程是外部的

那么你没有太多的选择:你需要通过操作系统API()。在Windows上,要调用的程序将是 ,而在Mac和Linux上,您可以尝试。Runtime.exectaskkill.exekill


有关详细信息,请查看 Java 8 中对 Process.destroyForcibly() 和 .isAlive() 的支持,以及使用 Java 杀死进程编写简单的 Java 应用程序以在指定时间后杀死任何进程


答案 2

如果你试图杀死你的java代码启动的主进程,我建议使用.这里解释了好处:我们什么时候应该在java中调用system exitSystem.exit()

从本质上讲,将运行关闭钩子,以确保在进程被杀死之前,任何可能尚未完成其工作的依赖非守护进程都被杀死。这是这样做的干净方法。System.exit()

如果该进程不是您的,您将不得不依靠操作系统为您完成这项工作,如以下答案中所述:使用Java杀死进程

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

现在至于 ,您通常会在由 java 代码生成的子进程上调用它,该子进程可能是从进程 api 或destroyForcibly()ProcessBuilder.start()Runtime.exec()


推荐