1、查看系统是否有僵尸进程
使用Top命令查找,当zombie前的数量不为0时,即系统内存在相应数量的僵尸进程。
2、定位僵尸进程
使用命令ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'定位僵尸进程以及该僵尸进程的父进程。
3、杀死僵尸进程
使用Kill -HUP 僵尸进程ID来杀死僵尸进程,往往此种情况无法杀死僵尸进程,此时就需要杀死僵尸进程的父进程。
kill -HUP 僵尸进程父ID
然后使用上面第二步的语句查询该僵尸进程是否被杀死。
4、参数解读
ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'
-A 参数列出所有进程
-o 自定义输出字段 stat(状态)、ppid(进程父id)、pid(进程id)、cmd(命令)
因为状态为z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
linux僵尸进程及僵尸进程的处理
僵尸进程
(1)进程中的指令已经执行完成,但是进程PCB结构还没有回收。
即子进程先于父进程退出后,子进程的PCB需要其父进程释放,但是父进程并没有释放子进程的PCB,这样的子进程就称为僵尸进程。
(2)父进程未结束,子进程结束,但父进程没有处理子进程的退出状态(当子进程先于父进程结束,父进程没有获取子进程的退出码,子进程的PCB会保留一段时间等待父进程在PCB中获取退出码,,且该进程不可执行,此时子进程变成僵尸进程)。
直到父进程获取到子进程的退出状态,子进程的PCB才会被移除。
我们的程序在退出的时候:return 0,exit(0),这个0就是退出码(状态信息),它存储在当前进程的PCB中,会有一个整型值来存储退出码。
当我们子进程结束以后,会把退出码写到PCB中,然后希望父进程可以获得到这个退出码,然后父进程就可以看到子进程是正常运行结束还是出错退出。正常的话我们return 0,失败的话我们return -1。
僵死进程产生了,会有什么影响?
杀死僵尸进程,方法三比较好用,推荐使用
1、查看所有的僵尸进程
ps -A -ostat,pid,ppid | grep -e '[zZ]'
例:Z 110 101
这列出了僵尸进程STAT列,进程ID、父进程ID
2、杀死所有僵尸进程
方法一:通过向父进程发送信号方式杀死,这种方法适用用父进程可以处理信号的情况
方法二:通过父进程杀死僵尸进程
方法三:直接杀死所有僵尸进程
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | awk -F" " '{ print $2 }' | xargs kill -HUP