如何避免容器内产生僵尸进程?
问题现象
原因分析
在容器中,僵尸进程的产生通常是由于父进程没有正确处理子进程的终止信号(即没有等待子进程结束)而导致的。在容器环境中,由于只有一个主进程(PID 1)作为所有其他进程的父进程,因此主进程需要负责处理子进程终止时的等待工作以避免僵尸进程的积累。而部分业务进程没有回收僵尸进程的能力,以这些业务进程作为容器内的1号进程运行容器时,容器内子进程退出即会成为僵尸进程。
部分低版本linux内核不存在该问题,原因是低版本linux存在一个namespace越界的BUG,容器内进程的父进程被错误指定成了容器外的shim进程,而shim进程具备回收子进程的能力,该BUG在linux v4.11版本及以上已修复。
解决方法
以具备回收子进程能力的进程(例如bash)作为容器内的1号进程启动容器。或者修改业务代码,在业务进程中正确处理子进程的终止信号。