如何解决如何在 shell 脚本中管道后台进程
我有一个 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。
有没有办法用 command3
捕获管道 grep
以便能够在进程结束时杀死?
谢谢
解决方法
我会回答我自己的问题。问题在于陷阱太有限了。我更改为正确杀死所有 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。