我有一个名为run.sh的bash脚本,它可以启动多个进程
#!/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!
发布于 2015-08-07 20:35:23
你说过你在Docker容器中运行这个脚本。您能提供更多关于如何启动容器和如何调用run.sh的详细信息吗?
当docker stop被调用或者容器接收到一个直接的SIGTERM时,PID为1的被包含的进程将接收它。当您的run.sh创建在后台中运行的子进程时,它还必须将信号转发到它们的。
因此,使用&在bash脚本中创建背景子进程不是一种好方法。使用supervisor将是一个很好的实践,因为它可以正确地处理信号,并将它们转发到它的子进程,而不需要任何进一步的脚本。
此外,supervisord不应该作为shell子进程本身启动。如果您在Dockerfile中将其指定为容器命令,就会发生这种情况
CMD /usr/bin/supervisord相反,它应该看起来像这样:
CMD ["/usr/bin/supervisord"]这样,supervisor将成为PID为1的根进程,并将正确地接收所有信号,并将它们重定向到其子进程。
发布于 2015-08-07 21:14:07
使用jobs -p获取任何后台作业的进程ids,然后将它们传递给kill。
trap 'kill $(jobs -p)' TERM
proc1 &
proc2 &
proc3 &
wait发布于 2015-08-07 20:25:36
正确,我会将它们全部收集到一个数组中,然后在完成时向每个数组发送一个信号。我会使用像awk '{ system("kill -15 " $1)}'这样的东西。
https://stackoverflow.com/questions/31877555
复制相似问题