【问题标题】:How do I get rid of Java child processes when my Java app exits/crashes?当我的 Java 应用程序退出/崩溃时,如何摆脱 Java 子进程?
【发布时间】:2010-09-20 15:22:25
【问题描述】:

我在 Java 中启动一个子进程如下:

final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);

它现在在后台运行。一切都很好。

如果我的程序现在崩溃了(它仍在开发中:-))子进程似乎仍然徘徊。当父 Java 进程死亡时,如何使其自动结束?

如果有帮助,我使用的是 Mac OS X 10.5

【问题讨论】:

    标签: java runtime subprocess shutdown process-management


    【解决方案1】:

    正如你所说,addShutdownHook 是要走的路。

    但是:

    • 如果程序终止,并不能真正保证您的关闭挂钩会被执行。有人可能会杀死 Java 进程,在这种情况下,您的关闭挂钩将不会被执行。 (如SO question中所说)

    • 一些标准库有自己的钩子,可能在你之前运行。

    • 小心死锁。

    另一种可能是wrap your java program in a service

    【讨论】:

      【解决方案2】:

      我自己已经解决了。我添加了一个shutdown hook,如下:

      final String[] cmd = {"<childProcessName>"};
      final Process process = Runtime.getRuntime().exec(cmd);
      Runnable runnable = new Runnable() {
          public void run() {
              process.destroy();
          }
      };
      Runtime.getRuntime().addShutdownHook(new Thread(runnable));
      

      【讨论】:

        【解决方案3】:

        添加关闭钩子不是杀死子进程的可靠方法。这是因为当从任务管理器执行强制终止时,可能不一定会执行 Shutdown 挂钩。

        一种方法是子进程可以定期监视其父进程的 PID。这样子进程可以在父进程退出时自行退出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-04
          • 2011-05-17
          • 1970-01-01
          相关资源
          最近更新 更多