用于生成进程、在 SIGTERM 上终止子进程的 shell 脚本
我想编写一个 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
I want to write a shell script that spawns several long-running processes in the background, then hangs around. Upon receiving SIGTERM, I want all the subprocesses to terminate as well.
Basically, I want a "master process".
Here's what I got so far:
#!/bin/sh
sleep 600 &
PID1="$!"
sleep 600 &
PID2="$!"
# supposedly this should kill the child processes on SIGTERM.
trap "kill $PID1 $PID2" SIGTERM
wait
The above script fails with trap: 10: SIGTERM: bad trap
.
Edit: I'm using Ubuntu 9.04
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这对我有用:
kill -- -$$
发送 SIGTERM 到整个进程组,从而杀死后代。在使用
set -e
时指定信号EXIT
非常有用(更多详细信息此处)。This works for me:
kill -- -$$
sends a SIGTERM to the whole process group, thus killing also descendants.Specifying signal
EXIT
is useful when usingset -e
(more details here).乔的回答让我走上了正轨。
我还发现我应该捕获更多信号来掩护我的基地。
最终脚本如下所示:
Joe's answer put me on the right track.
I also found out I should trap more signals to cover my bases.
Final script looks like this:
我怀疑你的 /bin/sh 不是 Bash (尽管你将问题标记为“Bash”)。
从消息中我猜这是一个 DASH。 如果您需要编写 Bash 代码,请检查其手册或修复您的 shebang。
I suspect your /bin/sh is not a Bash (though you tagged the question as 'Bash').
From the message I guess it's a DASH. Check its manual or just fix your shebang if you need to write Bash code.
该脚本看起来正确并且按预期对我有用。
如何将 SIGTERM 信号发送到“主进程”?
也许您应该执行
kill -l
来检查支持哪些信号。由于错误消息表明您发送了系统似乎无法识别的信号“10”。
下次你应该添加操作系统,shell版本,内核,......对于这样的问题
This script looks correct and works for me as expected.
How do you send the SIGTERM signal to the "master process"?
Maybe you should execute
kill -l
to check which signals are supported.As the error message suggests you send signal "10" which your system doesn't seem to recognize.
And next time you should add operating system, shell version, kernel, ... for such a question