标准答案
- PID 1 需要负责接收终止信号并回收退出的子进程,否则短任务结束后可能积累僵尸。
- 某些程序作为 PID 1 时对未显式注册的信号处理行为与普通进程不同,不能假设 shell 会自动正确转发。
- exec 启动应用可以让它成为主进程;需要额外子进程管理时可使用 tini 等轻量 init,并验证信号和回收行为。
- 停机测试要观察主进程、子进程、退出码和超时后的强制终止,不能只看容器是否最终消失。
题目解析
容器内 PID 1 负责接收运行时发送的停止信号,也承担孤儿进程的再托管和回收责任;某些程序作为 PID 1 时对信号的默认处理或子进程回收行为与普通进程不同。结果可能是 docker stop 等待超时、子进程残留或僵尸逐渐增多。
优先让真正的应用成为 PID 1 并正确处理 SIGTERM,或使用轻量 init/tini 负责转发信号和 reap。无论选哪种方式,都要验证应用退出码、子进程、后台任务和强制停止后的恢复语义,而不是只看容器最终消失。
常见误区
- 误区:认为 docker stop 一定能优雅终止所有子进程。改正:确认 PID 1 会转发信号、回收子进程,并为停机设置 deadline。
- 误区:启动脚本不 exec 主程序。改正:用 exec 或可靠 init,让主程序和运行时之间的信号链完整。