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