【问题标题】:Java Process.Destroy() does not kill all processJava Process.Destroy() 不会杀死所有进程
【发布时间】:2011-09-27 22:31:32
【问题描述】:

我有一个 Java 进程,它使用 Runtime.getRuntime().exec("myBin") 启动程序

这个“myBin”可能会分叉几次来完成它的工作。

我有一个阅读器线程从 exec() 返回的 Process 对象的 InputStream 和 ErrorStream 中读取“myBin”及其子项的所有输出

我的问题是:如果完成这项工作花费了太多时间,我需要终止进程并等待阅读器线程完成。(如果阅读器线程已读取 EOF,它将完成)

现在我发现,即使我使用 Process.Destroy(),我也只能杀死“myBin”本身及其所有子项。所以超时后,EOF 永远不会到达,所以读取线程挂起,直到所有子进程终止...

有没有办法安全地杀死由 Runtime.exec() 启动的进程和所有子进程

我在 Linux 上,跨平台不在我的考虑范围内。

【问题讨论】:

    标签: java linux process kill


    【解决方案1】:

    实现此目的的一种方法是让进程调用 fork 以保存子 pid 列表。您可以在 mybin 中实现一个处理程序,该处理程序也会触发杀死“孩子”。

    另一种选择是使用线程而不是使用分叉。

    这不起作用的主要问题是,如果您调用 fork,它将创建一个对父进程没有真正依赖关系的新进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2012-04-20
      相关资源
      最近更新 更多