转载

Docker系统中僵尸进程问题

原文 来自于phusion的baseimage项目,写的非常详细,我在这里recap下。

僵尸进程

子进程在结束后,内核仍然会为其维护一个基本的结构,保存其pid, 退出原因和状态等信息,父进程通过waitpid系统调用,可以获得这些信息。如果父进程没有调用waitpid,这些状态信息会一直保留,变成所谓僵尸进程。如果子进程后于父进程结束,一般来说, init进程会负责这些孤儿进程。

Docker系统中僵尸进程问题

对docker的影响

根据一般一个容器只运行一个进程的原则,对于一个web服务,它在容器中运行时的pid是1,假设它调用了bash的cgi脚本,而这个脚本又调用了grep,一段时间后,cgi脚本因为某种原因超时,web服务开始尝试杀死它,但是grep却并未受到影响,因此变成了孤儿进程。这时,pid=1的web服务应该能接管,但是绝大多数的web服务并没有init那样的能力,所以grep就变成了僵尸进程。

解决办法

phusion提供的baseimage提供了一个特殊的init程序,当启动docker的时候,通过使用这个init来加载服务,而不是直接在容器中启动服务程序。

docker run --rm -t -i phusion/baseimage:<VERSION> /sbin/my_init -- bash -l
正文到此结束
Loading...