【问题标题】:How to pipe background processes in a shell script如何在 shell 脚本中管理后台进程
【发布时间】:2021-01-22 14:12:34
【问题描述】:

我有一个 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 以便能够在进程结束时终止?

谢谢

【问题讨论】:

  • 试试 (command3 | grep -v "127.0.0.1") &

标签: shell pipe background-process


【解决方案1】:

我会回答我自己的问题。问题在于陷阱太有限了。我改为正确杀死所有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

【讨论】:

    猜你喜欢
    • 2012-09-30
    • 2021-03-08
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2014-12-18
    • 2021-08-11
    相关资源
    最近更新 更多