两个管道程序,一个在另一个被杀死后继续 运行

Two piped programs, one continues to run after another is killed

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

program1 | program2

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

杀死 program2 来测试这个
pkill program2

正在执行,但 program1 继续 运行。

据我了解,很多人都在问如何让program1继续运行,因为它默认被kill掉了。我错过了什么吗?

这个怎么样:

program1 | program2
rc="$?"; if [ "$rc" -ne 0 ]; then killall program1 > /dev/null 2>&1; fi

如果以上都不行,您可以尝试添加

set -o pipefail

到脚本的开头。该命令将退出其中一个步骤因第一个失败脚本的 return 代码而失败的管道。

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

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

在此代码段中,我们创建了一个名为 p 的命名管道,然后在后台创建 运行 program1,并将其标准输出重定向到 pp1_pid 存储 program1 的进程 ID 以备后用。请注意,program1 已启动,但会立即阻塞,直到打开 pfor eading. We runprogram2with its standard input redirected fromp`,然后在 运行s.

期间阻塞

program2 由于某种原因退出时,kill 命令将发送 SIGTERMprogram1 以在必要时将其杀死。这有两个好处:

  1. 它可以更快地杀死 program1,因为您不必等待 program1 写入管道并接收 SIGPIPE 信号。

  2. 如果 program1 正在处理 SIGPIPE,它也可能正在处理其他信号。您可以使用 kill 发送任何必要的信号(最多并包括 SIGKILL,如果 确实 必要)以终止进程。