用于生成进程的shell脚本,在SIGTERM上终止子进程

时间:2009-06-10 14:48:55

标签: bash scripting sh long-running-processes sigterm

我想编写一个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

4 个答案:

答案 0 :(得分:11)

这对我有用:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
  • kill -- -$$向整个流程组发送SIGTERM,从而杀死了后代。

  • 使用EXIT时,指定信号set -e很有用(更多详情here)。

答案 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版本,内核......