僵尸进程的发现与解决

什么是僵尸进程

在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个zombie process(僵尸进程)。在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程。 僵尸进程是一个早已死亡的进程,但在进程表(process table)中仍占了一个位置。

僵尸进程的危害

僵尸进程会占用系统资源,如果很多,则会严重影响服务器的性能。

如何查看linux系统上的僵尸进程?

#ps -ef | grep defunct
#ps -ef | grep  -w 'Z'   (查找状态为Z的进程,Z就是代表 zombie process)

进程的状态:
R 运行状态
S 睡眠状态
D 不可唤醒的睡眠状态,通常这个进程在等待I/O资源
T 停止状态
Z 僵尸状态(已经停止,但还在内存里)

如何杀死僵尸进程

一般僵尸进程很难kill掉,不过可以 kill 僵尸进程的父进程。父进程结束后, 僵尸进程成为孤儿进程,由 1号Init进程接管,成为僵尸进程的父进程,而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程,Init进程始终会负责僵尸进程。
执行如下命令杀死僵尸进程的父进程:
ps -e -o ppid,stat | grep Z | awk -F” ” ‘{print $1}’ | xargs kill -9

如何防止僵尸进程

(1)让僵尸进程成为孤儿进程,由init进程回收;(手动杀死父进程)
(2)调用fork()两次;
(3)捕捉sigchld信号,并在信号处理函数中调用wait函数。


版权声明:本文为liyantianmin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。