9

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

4 回答 4

13

这对我有用:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
于 2010-01-31T21:25:13.547 回答
5

乔的回答让我走上了正轨。我还发现我应该捕获更多信号来覆盖我的基地。

最终脚本如下所示:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

trap "kill $PID1 $PID2" exit INT TERM

wait
于 2009-06-10T15:27:55.673 回答
4

我怀疑您的 /bin/sh 不是 Bash(尽管您将问题标记为“Bash”)。

从消息中我猜它是 DASH。如果您需要编写 Bash 代码,请查看其手册或仅修复您的 shebang。

于 2009-06-10T15:26:03.307 回答
1

该脚本看起来正确并且按预期为我工作。

您如何将 SIGTERM 信号发送到“主进程”?也许您应该执行kill -l以检查支持哪些信号。正如错误消息建议您发送系统似乎无法识别的信号“10”。

下次你应该为这样的问题添加操作系统,shell版本,内核,......

于 2009-06-10T15:17:07.333 回答