gpt4 book ai didi

bash - 向所有进程发送 SIGTERM

转载 作者:行者123 更新时间:2023-12-01 05:09:36 39 4
gpt4 key购买 nike

我有一个 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/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com