终止由* nix上的ProcessBuilder生成的子进程

时间:2009-10-29 13:32:34

标签: java

我正在从java程序执行shell管道 - 它将类似于

ProcessBuilder builder = new ProcessBuilder(
                         "sh", "-c", "program1 | program2 | program3");
builder.start();

在某些情况下,可能需要终止此单元。然而

process.destroy();

只会破坏“sh”命令。 pipline中的命令将被孤立并由init进程采用。

有没有办法轻松终止所有这些子进程 - 或以一种更容易终止它们的方式执行上述管道。改变程序1/2/3无法完成。超出linux的可移植性不是问题。

3 个答案:

答案 0 :(得分:1)

我有两种方法可以做到这一点:

  1. 您可以运行pkill program1 program2 program3

  2. 你可以编写一个启动整个bash命令行的中间程序,这个中间程序会安装一个信号处理程序,当它收到STOP信号时会杀死它自己的孩子。

答案 1 :(得分:0)

不是在shell中运行管道,而是在java中构建管道。

然后你需要三个进程构建器(一个用于program1,一个用于program2,一个用于program3:D),还有一些线程将输出从每个进程的输出流传输到输入流下一个过程。

通过这种方式,您可以为每个子节点获取j.l.Process实例,并可以在这些实例上调用destroy()

答案 2 :(得分:0)

在C中创建一个包装器程序,它(a)启动管道的其余部分,(b)通过在调用exit(2)本身之前终止管道中的所有参与者来处理一些信号。