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

有帮助吗?

解决方案 2

乔的回答让我在正确的轨道上。 我还发现我应该陷阱多个信号,以覆盖我的碱基。

最终脚本看起来像这样:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

trap "kill $PID1 $PID2" exit INT TERM

wait

其他提示

这对我有用:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
  • kill -- -$$ 发送一个 信号术语 整个过程组,因此也杀死了后代。

  • 指定信号 EXIT 使用时很有用 set -e (更多细节 这里).

我怀疑你的/ bin / sh的是不是一个Bash的(虽然你标记了一个问题, '猛砸')。

从消息我想这是一个DASH。检查它的手册或刚修好你的家当,如果你需要编写代码猛砸

该脚本看起来是正确的和预期为我的作品。

您如何发送SIGTERM信号,“主过程”? 也许你应该执行kill -l检查哪些信号有支持。 由于错误信息提示你发送信号系统似乎“10”不认识。

和下一次你应该添加操作系统,外壳版本,内核,...对于这样的问题

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top