我的bash脚本中有两个程序:

program1 | program2

问题是program2可能崩溃,我想确保当它崩溃时,program1也会结束。我试着通过用
pkill program2

在执行期间,但程序1继续运行。
据我所知,许多人都在问如何使program1继续运行,因为它在默认情况下被终止。我遗漏了什么吗?

最佳答案

不要使用匿名管道,而是使用一个命名管道,使您可以更好地控制每一端。

mkfifo p
program1 > p &  p1_pid=$!
program2 < p
kill "$p1_pid"

在这个片段中,我们创建一个名为p的命名管道,然后在后台运行program1,其标准输出重定向到pp1_pid存储program1的进程id以供以后使用。注意program1是启动的,但是立即阻塞,直到pfor eading. We run程序2with its standard input redirected fromp`,然后在运行时阻塞。
program2因任何原因退出时,kill命令将发送SIGTERMprogram1以杀死它。这有两个好处:
它可以更快地杀死program1,因为您不必等待program1写入管道并接收SIGPIPE信号。
如果program1正在处理SIGPIPE,则它也可能正在处理其他信号。您可以使用kill发送终止进程所需的任何信号(如果真的需要,可以使用SIGKILL,包括)。

关于linux - 两个管道程序,一个继续运行,另一个被杀死,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40898592/

10-13 07:19