我正在使用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
有没有人对如何做有任何想法?
答案 0 :(得分:3)
是的,这是一个Bug,但如果您阅读评估,那么潜在的问题就是在Windows上实现“杀死所有小孩”几乎是不可能的。
答案是P1
需要负责自己的整理。
答案 1 :(得分:1)
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()将其终止。