You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:54:59