僵屍進程的清除


僵屍進程的清理
僵屍進程的清理方法還是很簡單的,不過我們先回顧一下基礎概念
僵屍進程:一個父進程利用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了,問題解決。
想根本解決僵屍進程的問題,那么需要從程序的角度出發來優化代碼才可以。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM