【发布时间】:2018-12-21 12:15:16
【问题描述】:
让我们考虑以下脚本:
#!/bin/bash
while true ; do: ; done
运行脚本后,bash 进入循环,但可以中断(通过按 Ctrl-C 或发出 kill -2 命令)或终止(通过发出 kill 命令)。一切运作良好。但现在让我们考虑另一个脚本:
#!/bin/bash
sleep 60
运行此脚本后,bash 进程不再对 SIGINT 或 SIGTERM 信号作出反应。当然,它会对按下 Ctrl-C 或终止睡眠进程作出反应,但我感兴趣的是让 bash 进程本身对这些信号作出反应。我需要这个,因为我正在使用 bash 脚本作为入口点构建 Docker 映像,并且 Docker 将信号发送到容器中的 PID 1,在我的情况下,这将是 bash 进程。我正在努力使容器优雅地关闭。 Bash 进程不对信号做出反应,因此 Docker 将其杀死以关闭容器。
我们将不胜感激。
【问题讨论】:
-
我建议您阅读hynek.me/articles/docker-signals,它解释了为什么信号处理可能是一个问题以及如何使其发挥作用。 tl;博士:您可能需要将
exec与--init结合使用。
标签: bash docker sigint sigterm