我的bash脚本中有两个程序:
program1 | program2
问题是program2可能崩溃,我想确保当它崩溃时,program1也会结束。我试着通过用
pkill program2
在执行期间,但程序1继续运行。
据我所知,许多人都在问如何使program1继续运行,因为它在默认情况下被终止。我遗漏了什么吗?
最佳答案
不要使用匿名管道,而是使用一个命名管道,使您可以更好地控制每一端。
mkfifo p
program1 > p & p1_pid=$!
program2 < p
kill "$p1_pid"
在这个片段中,我们创建一个名为
p
的命名管道,然后在后台运行program1
,其标准输出重定向到p
。p1_pid
存储program1
的进程id以供以后使用。注意program1
是启动的,但是立即阻塞,直到pfor eading. We run
程序2with its standard input redirected from
p`,然后在运行时阻塞。当
program2
因任何原因退出时,kill
命令将发送SIGTERM
到program1
以杀死它。这有两个好处:它可以更快地杀死
program1
,因为您不必等待program1
写入管道并接收SIGPIPE
信号。如果
program1
正在处理SIGPIPE
,则它也可能正在处理其他信号。您可以使用kill
发送终止进程所需的任何信号(如果真的需要,可以使用SIGKILL
,包括)。关于linux - 两个管道程序,一个继续运行,另一个被杀死,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40898592/