我有一个 bash 脚本调用 run.sh
启动多个进程
#!/bin/bash
proc1 &
proc2 &
proc3 &
final # this runs until sigterm
当我执行
run.sh
我向 run.sh 发送了一个 SIGTERM,我不认为 SIGTERM 被发送到 final
,我不认为它被发送到 proc1
, proc2
, 和 proc3
.请注意,在这个用例中,这是一个运行 run.sh
的 docker 容器。 ,并运行 docker stop
是我尝试发送 SIGTERM 的方式。bash 脚本将 sigterm 发送到它启动的所有进程的最简单方法是什么?我能想到的唯一方法是启动
final
与 &
也然后在 run.sh
中做一个 while 循环?编辑 - 我已经尝试过了,但似乎不起作用:
在
run.sh
#!/bin/bash
_term() {
echo "Caught SIGTERM signal!"
}
trap _term SIGTERM
echo "hi"
sleep 100000 &
wait $!
运行 docker stop 时,我从来没有看到
Caught SIGTERM signal!
最佳答案
您说您在 Docker 容器中运行该脚本。你能告诉我们更多关于你如何启动容器以及 run.sh
的细节吗?被调用?。
当docker stop
被调用或直接 SIGTERM
由容器接收,PID 为 1 的包含进程将接收它。当您的 run.sh
创建在后台运行的子进程 它还必须向他们转发信号 .
因此,使用 &
在 bash 脚本中创建后台子进程并不是一个好方法。 .使用 supervisor将是一个很好的做法,因为它可以正确处理信号并将它们转发到其子进程,而无需任何进一步的脚本编写。
另外supervisord
不应作为 shell 子进程本身启动。如果您在 Dockerfile
中将此指定为容器命令,则会发生这种情况。 :
CMD /usr/bin/supervisord
相反,它应该看起来像:
CMD ["/usr/bin/supervisord"]
这样,主管就成为 PID 为 1 的根进程,并将正确接收所有信号并将它们重定向到其子进程。
关于bash - 向所有进程发送 SIGTERM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31877555/