两个管道程序,一个在另一个被杀死后继续 运行
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
,并将其标准输出重定向到 p
。 p1_pid
存储 program1
的进程 ID 以备后用。请注意,program1
已启动,但会立即阻塞,直到打开 pfor eading. We run
program2with its standard input redirected from
p`,然后在 运行s.
期间阻塞
当 program2
由于某种原因退出时,kill
命令将发送 SIGTERM
到 program1
以在必要时将其杀死。这有两个好处:
它可以更快地杀死 program1
,因为您不必等待 program1
写入管道并接收 SIGPIPE
信号。
如果 program1
正在处理 SIGPIPE
,它也可能正在处理其他信号。您可以使用 kill
发送任何必要的信号(最多并包括 SIGKILL
,如果 确实 必要)以终止进程。
我的 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
,并将其标准输出重定向到 p
。 p1_pid
存储 program1
的进程 ID 以备后用。请注意,program1
已启动,但会立即阻塞,直到打开 pfor eading. We run
program2with its standard input redirected from
p`,然后在 运行s.
当 program2
由于某种原因退出时,kill
命令将发送 SIGTERM
到 program1
以在必要时将其杀死。这有两个好处:
它可以更快地杀死
program1
,因为您不必等待program1
写入管道并接收SIGPIPE
信号。如果
program1
正在处理SIGPIPE
,它也可能正在处理其他信号。您可以使用kill
发送任何必要的信号(最多并包括SIGKILL
,如果 确实 必要)以终止进程。