首页/云/云与容器速查/PID 1 信号处理与 --init
本包目录(340 条)
云基础概念44 条计算与存储56 条网络与安全组33 条
容器与 Docker106 条
Kubernetes68 条容器排障33 条

PID 1 信号处理与 --init

容器内 PID 1 不享受内核的默认信号兜底,且不负责回收僵尸进程。应用若没处理 SIGTERM,docker stop 只能等超时强杀,造成停机变慢或数据损坏。

云与容器速查云更新于 2026-10-12
问题PID 1 忽略未显式处理的信号;僵尸进程无人回收
表现docker stop 后进程不退,10 秒后收到 SIGKILL(退出码 137)
方案 A应用直接作为 PID 1 并自行处理 SIGTERM(exec 形式启动)
方案 Bdocker run --init 注入 tini:转发信号+回收僵尸
调优docker stop -t 30 延长优雅停止窗口

使用示例

使用示例
docker run -d --init --name app -t 30 myapp:1.0
docker stop app
shell 脚本入口必须以 exec "$@" 结尾让应用接管 PID 1,否则信号永远停在脚本层。

易错点

  • 把手写脚本当 PID 1 又不转发信号:每次停容器都等满超时
  • Java 应用不处理 SIGTERM(用 kill -9 关):停机时数据未刷盘

数据来源与参考

  • Docker Docs:docker run --init
  • Docker Docs:PID 1 and signals(tini)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌