bash - 向所有进程发送 SIGTERM

标签 bash shell docker

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

相关文章:

linux - 我正在使用触摸在我桌面上的文件夹中创建一个文件...当我尝试这个时它说找不到命令

java - 远程执行shell脚本时找不到"readOnly"等符号

python - 如何停止Docker数据库容器

java - 我可以将 Oracle JDBC 驱动程序 JAR 捆绑在 Docker 镜像中吗?

docker - 可以直接修改基础镜像吗?

Python 相当于 bash 排序字典序和数字

bash - Lando:环境变量导致exec错误

linux - if 语句中的未知错误

linux - 编写 bash 脚本来更改文本并写入日志

linux - shell 脚本不使用 SMTP 服务器准确发送邮件