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

标签 java linux process kill

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

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

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

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

现在我发现,即使我使用 Process.Destroy(),我也只能杀死“myBin”而不是它本身及其所有子项。因此在超时之后,EOF 从未到达,因此读取器线程挂起,直到所有子进程终止...

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

我在 Linux 上,跨平台不是我的想法。

最佳答案

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

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

为什么这行不通的主要问题是,如果您调用 fork,它将创建一个与父进程没有真正依赖关系的新进程。

关于Java Process.Destroy() 不会杀死所有进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6568291/

相关文章:

java - PaintComponent 绘制两次

linux - Hudson 如何在 Linux 上独立工作?

java - 如何将 Bash 与 Java 集成

c - C 中的 fork 和指针

c# - 进程启动但不显示窗口

java - 如何给出 Ant 任务的枚举属性的允许值列表

java - 单击 JButton 时打印特定值

java - 如何在 Rxjava 中观察套接字直到取消订阅

linux - 递归地输出目录中某种类型的所有文件的文件大小?

linux - 操作系统内核是否以与 IPC 相同的方式与进程通信?