在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程。
如何查看linux系统上的僵尸进程,如何统计有多少僵尸进程?
#ps -ef | grep defunct
或者查找状态为Z的进程,Z就是代表zombie process,僵尸进程的意思。
另外使用top命令查看时有一栏为S,如果状态为Z说明它就是僵尸进程。
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
top命令中也统计了僵尸进程。或者使用下面的命令:
ps -ef | grep defunct | grep -v grep | wc -l
一般来说僵尸进程用kill杀不死,但是我们可以杀死僵尸进程的父进程。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
一步步讲解
首先ps -eo ppid,stat
-e查看所有进程,-o可以查看用户自定义的状态,例如-o ppid查看所有进程的ppid,可选项pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
这里我们选取ppid父进程的id和stat状态
然后ps -eo ppid,stat|grep Z从所有进程中的stat状态中选择状态为Z也就是zombie的进程
接着ps -eo ppid,stat|grep Z|cut 1-5因为我们只要僵尸进程的父进程id,所以使用cut来选取父进程id
最后ps -eo ppid,stat|grep Z|cut 1-5|xargs kill -9将前面选取的父进程id作为参数发送给kill -9去执行。
到此我们杀死了所有僵尸进程的父进程,僵尸进程一般也都已经杀死了。