僵尸进程的清除

僵尸进程的清理
僵尸进程的清理方法还是很简单的,不过我们先回顾一下基础概念
僵尸进程:一个父进程利用fork创建子进程,如果子进程退出,而父进程没有利用wait方法或者waitpid方法来获取子进程的状态信息,那么子进程的状态依然保存在系统中。
与之对应的就是孤儿进程:一个父进程退出, 而它的一个或几个子进程仍然还在运行,那么这些子进程就会变成孤儿进程,孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集的工作

所以说孤儿进程最后会被系统的老祖宗init 1进程来收养,但是僵尸进程则不然,他一直保存在系统里面并占用系统的资源。所以一旦出现大量的僵尸进程,我们势必要解决掉才可以。
最简单的方法就是重启系统,但是太low了。下面介绍一个方法:
1、使用top发现僵尸进程

root@aaa:~ # top
last pid: 27676;  load averages:  0.83,  0.78,  0.70      
103 processes: 1 running, 101 sleeping, 1 zombie
CPU:  0.2% user,  0.0% nice,  1.1% system,  0.0% interrupt, 98.7% idle

此时发现一个僵尸进程
2、找到该僵尸进程

root@freenas:~ # ps aux | grep defunct | grep -v grep
root       52405    0.0  0.0      0      0  -  Z    21Sep20       0:00.00 <defunct>

第二列就是该僵尸进程的pid号,
3、找到其该僵尸进程的父进程的pid号,即ppid

root@freenas:~ # ps axjf | grep defunct | grep -v grep
USER            PID  PPID  PGID   SID JOBC STAT TT           TIME COMMAND
root          52405 52403  5107  5107    0 Z     -        0:00.00 <defunct>

可以看到父进程pid号是52403。
我们看看这个父进程是干什么的

root@freenas:~ # ps aux | grep -v grep | grep 52403
root       52403    0.0  0.0  13040   2496  -  I    21Sep20       0:00.00 /usr/bin/bc

原来是一个bc程序,kill掉
4、kill掉其父进程
kill掉父进程的目的就是让这个僵尸进程变成孤儿进程,进而被系统的init进程来收养,达到清理僵尸进程的目的

root@freenas:~ # kill -9 52403

ok了,问题解决。
想根本解决僵尸进程的问题,那么需要从程序的角度出发来优化代码才可以。

原文地址:https://www.cnblogs.com/FengGeBlog/p/13926958.html