如何在 shell 脚本中管理后台进程

How to pipe background processes in a shell script

我有一个 Shell 脚本,它启动一些后台进程(使用 &)并在用户调用 Ctrl+C(使用 trap)时自动终止。这很好用:

#!/bin/sh

trap "exit" INT TERM ERR
trap "kill 0" EXIT

command1 &
command2 &
command3 &

wait

现在我想用 grep -v "127.0.0.1" 过滤 command3 的输出,以排除所有带有 127.0.0.1 的行。像这样:

#!/bin/sh

trap "exit" INT TERM ERR
trap "kill 0" EXIT

command1 &
command2 &
command3 | grep -v "127.0.0.1" & 

wait

问题是信号 Ctrl+C 不再终止 command3。

有没有办法用 grep 捕获管道 command3 以便能够在进程结束时终止?

谢谢

我会回答我自己的问题。问题是陷阱太有限了。我改为正确杀死所有jobs

#!/bin/sh

killjobs() {
    for job in $(jobs -p); do
        kill -s SIGTERM $job > /dev/null 2>&1 || (sleep 10 && kill -9 $job > /dev/null 2>&1 &)
    done
}
trap killjobs EXIT

command1 &
command2 &
command3 | grep -v "127.0.0.1" & 

wait