如何在 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
我有一个 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