Java Destroy()不会杀死所有进程

Java Destroy()不会杀死所有进程,java,linux,process,kill,Java,Linux,Process,Kill,我有一个Java进程,它使用Runtime.getRuntime().exec(“myBin”)启动一个程序 这个“myBin”可能会多次分叉来完成它的工作 我有一个读线程,可以从exec()返回的进程对象的InputStream和ErrorStream中读取“myBin”及其子对象的所有输出 我的问题是:如果完成作业花费太多时间,我需要终止进程并等待读线程完成。(如果读线程已读取EOF,则读线程将完成) 现在我发现,即使我使用Process.Destroy(),我也只能杀死“myBin”本身及

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

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

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

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

现在我发现,即使我使用Process.Destroy(),我也只能杀死“myBin”本身及其所有子对象。所以在超时之后,EOF从未达到,所以读卡器线程将挂起,直到所有子进程终止

是否有一种方法可以安全地杀死由Runtime.exec()启动的进程和所有子进程


我在Linux上,不考虑跨平台。

实现这一点的一种方法是让调用fork的进程保存子PID列表。您可以在mybin中实现一个处理程序,它也会触发杀死“childrens”

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

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