我想编写一个shell脚本,在后台生成几个长时间运行的进程,然后挂起。收到SIGTERM后,我希望所有子进程也终止。
基本上,我想要一个“主过程”。
这是我到目前为止所得到的:
#!/bin/sh
sleep 600 &
PID1="$!"
sleep 600 &
PID2="$!"
# supposedly this should kill the child processes on SIGTERM.
trap "kill $PID1 $PID2" SIGTERM
wait
以上脚本失败并显示trap: 10: SIGTERM: bad trap
。
编辑:我正在使用Ubuntu 9.04
答案 0 :(得分:11)
这对我有用:
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
答案 1 :(得分:5)
Joe的回答让我走上正轨。 我还发现我应该捕获更多的信号来覆盖我的基地。
最终脚本如下所示:
#!/bin/sh
sleep 600 &
PID1="$!"
sleep 600 &
PID2="$!"
trap "kill $PID1 $PID2" exit INT TERM
wait
答案 2 :(得分:4)
我怀疑你的/ bin / sh不是Bash(虽然你把问题标记为'Bash')。
从消息中我猜它是DASH。如果您需要编写Bash代码,请查看其手册或修复您的shebang。
答案 3 :(得分:1)
此脚本看起来正确,并按预期为我工作。
如何将SIGTERM信号发送到“主进程”?
也许你应该执行kill -l
来检查支持哪些信号。
由于错误消息建议您发送信号“10”,您的系统似乎无法识别。
下次你应该为这样的问题添加操作系统,shell版本,内核......