如何杀死Java进程的子进程?

时间:2011-05-04 07:11:49

标签: java process runtime runtime.exec

我正在使用Process P1= Runtime.exec(...)创建流程P1。我的流程P1正在创建另一个流程,例如P2,P3 ....

然后我想杀死进程P1和P1创建的所有进程,即P2,P3 ......

P1.destroy()仅杀死P1,而不是其子进程。

我也用谷歌搜索它,发现它是一个Java bug: http://bugs.sun.com/view_bug.do?bug_id=4770092

有没有人对如何做有任何想法?

6 个答案:

答案 0 :(得分:3)

是的,这是一个Bug,但如果您阅读评估,那么潜在的问题就是在Windows上实现“杀死所有小孩”几乎是不可能的。

答案是P1需要负责自己的整理。

答案 1 :(得分:1)

Java没有充分理由公开有关进程孙子的任何信息。如果您的子进程启动另一个进程,那么由子进程来管理它们。

我建议

  • 重构您的设计,以便您的父级创建/控制所有子进程,或
  • 使用操作系统命令销毁进程,或
  • 使用另一种控制机制,如某种形式的进程间通信(有很多Java库为此设计)。

向@Giacomo道具,向我推荐IPC。

答案 2 :(得分:0)

您是在编写其他流程的代码还是您无法更改的代码?

如果可以的话,我会考虑修改它们以便它们接受某种消息(即使是通过标准流),这样它们可以根据请求很好地终止,如果它们有自己的终止,就会终止它们。

我没有发现“破坏过程”的东西很干净。

答案 3 :(得分:0)

如果是bug,正如你所说那么你必须跟踪子进程的pf进程树并且当你想要杀死父进程时从树中杀死所有子进程 如果只有几个进程而不是使用列表

,则需要使用数据结构树

答案 4 :(得分:0)

我有一个类似的问题,我启动了一个 PowerShell 进程,它启动了一个 Ping 进程,当我停止我的 Java 应用程序时,PowerShell 进程会死(我会使用 Process.destroy() 来杀死它)但是 Ping 进程它创建不会。

在弄乱它之后,这个方法能够做到这一点:

private void stopProcess(Process process) {
    process.descendants().forEach(new Consumer<ProcessHandle>() {
        @Override
        public void accept(ProcessHandle t) {
            t.destroy();
        }
    });
    process.destroy();
}

它会杀死给定的进程及其所有子进程。

PS:您需要 Java 9 才能使用 Process.descendants() 方法。

答案 5 :(得分:-1)

由于Runtime.exec()返回Process的实例,您可以使用某个数组存储其引用并稍后通过Process.destroy()将其终止。