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

发布于 2024-07-24 18:03:05 字数 408 浏览 14 评论 0原文

我想编写一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

风为裳 2024-07-31 18:03:05

这对我有用:

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

  • 在使用set -e时指定信号EXIT非常有用(更多详细信息此处)。

This works for me:

trap "trap - SIGTERM && kill -- -$" SIGINT SIGTERM EXIT
  • kill -- -$$ sends a SIGTERM to the whole process group, thus killing also descendants.

  • Specifying signal EXIT is useful when using set -e (more details here).

岁吢 2024-07-31 18:03:05

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

最终脚本如下所示:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

trap "kill $PID1 $PID2" exit INT TERM

wait

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

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

trap "kill $PID1 $PID2" exit INT TERM

wait
沙与沫 2024-07-31 18:03:05

我怀疑你的 /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.

童话 2024-07-31 18:03:05

该脚本看起来正确并且按预期对我有用。

如何将 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文