Java Process.Destroy()不会终止所有进程

时间:2011-07-04 07:01:47

标签: java linux process kill

我有一个使用Runtime.getRuntime()启动程序的Java进程.exec(“myBin”)

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

我有一个读者线程,可以从exec()返回的Process对象的InputStream和ErrorStream中读取“myBin”及其子节点的所有输出

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

现在我发现,即使我使用Process.Destroy(),我也只能杀死自己及其所有孩子的“myBin”。因此,在超时之后,EOF从未到达,因此读者线程会挂起,直到所有子进程终止...

有没有办法安全杀死进程和Runtime.exec()

启动的所有子进程

我在Linux上,跨平台不在我的脑海里。

1 个答案:

答案 0 :(得分:1)

实现此目标的一种方法是让调用fork的进程保存子pids列表。你可以在mybin中实现一个处理程序,它也可以杀死“孩子们”。

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

为什么这不起作用的主要问题是如果你调用fork它会创建一个新的进程,它对父进程没有真正的依赖。