【问题标题】:The right way to kill a process in Java在Java中杀死进程的正确方法
【发布时间】:2016-05-15 19:19:54
【问题描述】:

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

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

使用destroyForcibly() ?

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

【问题讨论】:

  • 这是您自己的进程还是其他进程?
  • 是java进程还是任何进程?
  • 这是针对外部非 Java 进程的,但感谢 Shitsu 的双向支持

标签: java process kill runtime.exec destroy


【解决方案1】:

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

那么您可能对它有一个引用(ProcessBuilder.start()Runtime.exec() 都返回一个引用)。在这种情况下,您只需致电p.destroy()。我认为这是最干净的方式(但要小心:p 启动的子进程可能会保持活动状态,请查看Process.destroy does not kill multiple child processes 了解更多信息)。

destroyForcibly 仅应在 destroy() 在特定超时后失败时使用。一言以蔽之

  1. 使用destroy() 终止进程
  2. 允许进程以合理的超时正常退出
  3. 如果进程还活着,用destroyForcibly() 杀死它

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

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


查看Support for Process.destroyForcibly() and .isAlive() from Java 8Killing a process using JavaCode a Simple Java App to Kill Any Process After a Specified Time 了解更多信息。

【讨论】:

  • 非常感谢您的解释!这绝对是我想要的
【解决方案2】:

如果你想杀死你的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()启动的

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在 java 8 源代码中

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

      我只想说 destroyForcibly 等于 Java 8 中的 destroy
      因此,如果在您调用destroy 方法后进程还活着,您应该尝试通过 pid 杀死该进程。 如果您使用的是 java 9+,您可以轻松获取 pid,只需调用 Process.pid() 方法。

      【讨论】:

      • 一些解释会大大提高答案的质量,帮助以后可能遇到类似问题的其他用户请花点时间阅读帮助页面stackoverflow.com/help/how-to-answer
      • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      • 如果你再深入一点,你可能会发现实际上有一个子类以不同的方式实现destroyForcibly()。对于 Unices,似乎从 Java 1.5 开始就是这样(寻找 ProcessImpl,它实际上最终调用了本机代码)。所以它不等同于普通的destroy()。
      • 如果一样的话,为什么还有“destroyForcibly”呢?有没有不一样的JVM?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 2018-02-12
      • 1970-01-01
      相关资源
      最近更新 更多