Docker+Bash信号处理异常:发送SIGTERM后_term函数未执行
问题根源
你的场景里,tini作为PID1确实正确传递了SIGTERM信号给子进程/bin/bash,但交互式Bash默认会忽略SIGTERM信号,这才是捕获函数未执行的核心原因。
默认情况下,当你直接启动/bin/bash(无-c参数或脚本路径),Bash会进入交互式模式。交互式Bash的信号处理规则中,SIGTERM、SIGQUIT这类终止信号会被默认忽略——你可以在容器里执行trap -p验证,交互式环境下不会看到针对SIGTERM的陷阱配置。
修复方案
针对这个问题,有两种可靠的解决方式:
切换为非交互式Bash运行脚本
修改容器的CMD,让Bash直接以非交互式模式执行你的脚本,例如:CMD ["bash", "/path/to/script.sh"]非交互式Bash不会默认忽略
SIGTERM,此时tini传递的信号会触发你设置的_term捕获函数。强制交互式Bash处理SIGTERM
如果必须保留交互式Bash环境,可以在你的script.sh开头添加set -m启用作业控制,同时确保trap '_term' SIGTERM的配置正确。不过这种方式不如非交互式模式稳定,仅适合特殊场景。
验证方法
你可以进入运行中的容器,执行ps aux找到bash的PID,然后直接发送kill -15 <bash-pid>,会发现交互式Bash毫无响应——这直接证明了信号被忽略的问题。
内容的提问来源于stack exchange,提问作者Bernard Halas
相关产品推荐
相关产品推荐

