孤儿进程和僵尸进程

原理与定义

首先要知道,linux有父进程和子进程这样的说法。那父进程如何创建子进程呢?fork

子进程的进行和父进程的进行是异步的,但是父进程就像父母一样对自己的小孩也有一定的控制欲,这个控制欲就表现在如果子进程如果结束了,它释放了之前占用的资源、内存、文件等等,但是它还保留了一点信息:进程号PID、退出状态、运行时间等等。而这些残留信息是父进程通过wait/waitpid来获取,如果父进程一直不获取,那么子进程就会一直保留这些信息直到海枯石烂。

孤儿进程:父进程退出,子进程继续进行,那么此时子进程就是孤儿进程。这个时候init进程(进程号为1)来作为子进程的监护人,发出wait/waitpid来完成状态收集工作;
paradin

僵尸进程:父进程没有退出,但是它迟迟不发出wait/waitpid来回收子进程的资源。就好比儿子死了,当爹的不给收尸,这个儿子就成了孤魂野鬼成了僵尸。

影响与危害

孤儿进程是没有什么大的危害,虽然他虽然没有了亲生父亲,但是也有init进程来通过循环的wait()来处理它的善后工作,所以迟早会把占用的资源释放掉。

甚至有的用户可以把进程弄成孤儿进程,以使之与用户会话脱钩,并转至后台运行。这一做法常应用于启动需要长时间运行的进程,也即守护进程。另外,nohup命令也可以完成这一操作。

但是僵尸进程不一样,要是父进程对子进程一直不使用wait/waitpid,那么pid就会不回收,可是系统内的pid总是是有限的,这样久而久之就是对pid的一个霸占,新的进程也无法生成,这就是僵尸进程的危害。

如何处理僵尸进程

僵尸进程是杀不死的,怎么办?杀他爹,把父进程杀掉了,那么这些僵尸就成了孤儿进程,然后再由init收养,最后入土为安。

查看当前服务器僵尸进程的方法:

1
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'

如果服务器上的僵尸进程不是出自一个父进程之手,那么就用下面这个命令批量解决:

1
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9

但是如果父进程是init进程,那么这样的僵尸进程怎么办?答案,不用刻意管他,相信init的能力,它迟早会被init回收的,成为僵尸进程也是暂时的。

参考资料

https://zh.wikipedia.org/wiki/%E5%83%B5%E5%B0%B8%E8%BF%9B%E7%A8%8B
https://zh.wikipedia.org/wiki/%E5%AD%A4%E5%84%BF%E8%BF%9B%E7%A8%8B
http://blog.csdn.net/YuZhiHui_No1/article/details/53011390
paradin

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------