我正在从java程序执行shell管道 - 它将类似于
ProcessBuilder builder = new ProcessBuilder(
"sh", "-c", "program1 | program2 | program3");
builder.start();
在某些情况下,可能需要终止此单元。然而
process.destroy();
只会破坏“sh”命令。 pipline中的命令将被孤立并由init进程采用。
有没有办法轻松终止所有这些子进程 - 或以一种更容易终止它们的方式执行上述管道。改变程序1/2/3无法完成。超出linux的可移植性不是问题。
答案 0 :(得分:1)
我有两种方法可以做到这一点:
您可以运行pkill program1 program2 program3
你可以编写一个启动整个bash命令行的中间程序,这个中间程序会安装一个信号处理程序,当它收到STOP信号时会杀死它自己的孩子。
答案 1 :(得分:0)
不是在shell中运行管道,而是在java中构建管道。
然后你需要三个进程构建器(一个用于program1,一个用于program2,一个用于program3:D),还有一些线程将输出从每个进程的输出流传输到输入流下一个过程。
通过这种方式,您可以为每个子节点获取j.l.Process实例,并可以在这些实例上调用destroy()
。
答案 2 :(得分:0)
在C中创建一个包装器程序,它(a)启动管道的其余部分,(b)通过在调用exit(2)本身之前终止管道中的所有参与者来处理一些信号。