僵尸进程的清理
僵尸进程的清理方法还是很简单的,不过我们先回顾一下基础概念
僵尸进程:一个父进程利用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了,问题解决。
想根本解决僵尸进程的问题,那么需要从程序的角度出发来优化代码才可以。