首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向所有进程发送SIGTERM

向所有进程发送SIGTERM
EN

Stack Overflow用户
提问于 2015-08-07 20:18:22
回答 3查看 4.6K关注 0票数 4

我有一个名为run.sh的bash脚本,它可以启动多个进程

代码语言:javascript
复制
#!/bin/bash
proc1 &
proc2 &
proc3 &
final # this runs until sigterm

当我执行run.sh并向run.sh发送SIGTERM时,我不认为SIGTERM被发送到final,我也不认为它被发送到proc1proc2proc3。请注意,在这个用例中,这是一个运行run.sh的docker容器,而运行docker stop是我试图发送SIGTERM的方式。

bash脚本向它启动的所有进程发送sigterm的最简单方法是什么?我能想到的唯一方法就是用&启动final,然后在run.sh中执行while循环

编辑-我已经尝试过了,但似乎不起作用:在run.sh

代码语言:javascript
复制
#!/bin/bash
_term() { 
  echo "Caught SIGTERM signal!" 
}
trap _term SIGTERM
echo "hi"
sleep 100000 &
wait $!

在运行docker stop时,我从未看到Caught SIGTERM signal!

EN

回答 3

Stack Overflow用户

发布于 2015-08-07 20:35:23

你说过你在Docker容器中运行这个脚本。您能提供更多关于如何启动容器和如何调用run.sh的详细信息吗?

docker stop被调用或者容器接收到一个直接的SIGTERM时,PID为1的被包含的进程将接收它。当您的run.sh创建在后台中运行的子进程时,它还必须将信号转发到它们的

因此,使用&在bash脚本中创建背景子进程不是一种好方法。使用supervisor将是一个很好的实践,因为它可以正确地处理信号,并将它们转发到它的子进程,而不需要任何进一步的脚本。

此外,supervisord不应该作为shell子进程本身启动。如果您在Dockerfile中将其指定为容器命令,就会发生这种情况

代码语言:javascript
复制
CMD /usr/bin/supervisord

相反,它应该看起来像这样:

代码语言:javascript
复制
CMD ["/usr/bin/supervisord"]

这样,supervisor将成为PID为1的根进程,并将正确地接收所有信号,并将它们重定向到其子进程。

票数 1
EN

Stack Overflow用户

发布于 2015-08-07 21:14:07

使用jobs -p获取任何后台作业的进程ids,然后将它们传递给kill

代码语言:javascript
复制
trap 'kill $(jobs -p)' TERM

proc1 &
proc2 &
proc3 &

wait
票数 1
EN

Stack Overflow用户

发布于 2015-08-07 20:25:36

正确,我会将它们全部收集到一个数组中,然后在完成时向每个数组发送一个信号。我会使用像awk '{ system("kill -15 " $1)}'这样的东西。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31877555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档