Linux下殺殭屍進程辦法

Linux認證輔導:Linux下殺殭屍進程辦法



爲了方便廣大考生更好的複習,小編編輯整理提供了Linux認證:Linux下殺殭屍進程辦法,以供各位考生考試複習參考,希望對考生複習有所幫助。


1) 檢查當前殭屍進程信息

# ps -ef | grep defunct | grep -v grep | wc -l

175

# top | head -2

top - 15:05:54 up 97 days, 23:49, 4 users, load average: 0.66, 0.45, 0.39

Tasks: 829 total, 1 running, 479 sleeping, 174 stopped, 175 zombie

# ps -ef | grep defunct | grep -v grep

2) 獲得殺殭屍進程語句

# ps -ef | grep defunct | grep -v grep | awk ‘{print “kill -9 ” $2,$3}’

執行上面獲得的語句即可, 使用信號量9, 殭屍進程數會大大減少。

3) 過一會兒檢查當前殭屍進程信息

# ps -ef | grep defunct | grep -v grep | wc -l

125

# top | head -2

top - 15:29:26 up 98 days, 12 min, 7 users, load average: 0.27, 0.54, 0.56

Tasks: 632 total, 1 running, 381 sleeping, 125 stopped, 125 zombie

發現殭屍進程數減少了一些, 但還有不少啊。

4) 再次獲得殺殭屍進程語句

# ps -ef | grep defunct | grep -v grep | awk ‘{print “kill -18 ” $3}’

執行上面獲得的語句即可, 這次使用信號量18殺其父進程, 殭屍進程應該會全部消失。

5) 過一會兒再檢查當前殭屍進程信息

# ps -ef | grep defunct | grep -v grep | wc -l

0

# top | head -2

top - 15:39:46 up 98 days, 23 min, 7 users, load average: 5.46, 2.20, 1.12

Tasks: 134 total, 1 running, 133 sleeping, 0 stopped, 0 zombie

6) 清除ZOMBIE(殭屍)進程原理

# kill -18 PPID

PPID是其父進程, 這個信號是告訴父進程, 該子進程已經死亡了, 請收回分配給他的資源。 如果還不行則看先看其父進程又無其他子進程, 如果有, 可能需要先kill其他子進程, 也就是兄弟進程。

方法是:

# kill -15 PID1 PID2

PID1,PID2是殭屍進程的父進程的其它子進程。

然後再kill父進程:

# kill -15 PPID

In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie.


在UNIX 系統中,一個進程結束了,但是他的父進程沒有等待(調用wait / waitpid)他, 那麼他將變成一個殭屍進程. 在fork()/execve()過程中,假設子進程結束時父進程仍存在,而父進程fork()之前既沒安裝SIGCHLD信號處理函數調用 waitpid()等待子進程結束,又沒有顯式忽略該信號,則子進程成爲殭屍進程。


如何查看linux系統上的殭屍進程,如何統計有多少殭屍進程?


#ps -ef | grep defunct


或者查找狀態爲Z的進程,Z就是代表zombie process,殭屍進程的意思。


另外使用top命令查看時有一欄爲S,如果狀態爲Z說明它就是殭屍進程。


Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie


top命令中也統計了殭屍進程。或者使用下面的命令:


ps -ef | grep defunct | grep -v grep | wc -l


如何殺死殭屍進程呢?

一般殭屍進程很難直接kill掉,不過您可以kill殭屍爸爸。父進程死後,殭屍進程成爲”孤兒進程”,過繼給1號進程init,init始終會負責清理殭屍進程.它產生的所有殭屍進程也跟着消失。


ps -e -o ppid,stat | grep Z | cut -d ” ” -f2 | xargs kill -9



kill -HUP `ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’{print $2}’`


當然您可以自己編寫更好的shell腳本,歡迎與大家分享。


另外子進程死後,會發送SIGCHLD信號給父進程,父進程收到此信號後,執行waitpid()函數爲子進程收屍。就是基於這樣的原理:就算父進程沒有調用wait,內核也會向它發送SIGCHLD消息,而此時,儘管對它的默認處理是忽略,如果想響應這個消息,可以設置一個處理函數。


如何避免殭屍進程呢?

處理SIGCHLD信號並不是必須的。但對於某些進程,特別是服務器進程往往在請求到來時生成子進程處理請求。如果父進程不等待子進程結 束,子進程將成爲殭屍進程(zombie)從而佔用系統資源。如果父進程等待子進程結束,將增加父進程的負擔,影響服務器進程的併發性能。在Linux下 可以簡單地將 SIGCHLD信號的操作設爲SIG_IGN。

signal(SIGCHLD,SIG_IGN);

這樣,內核在子進程結束時不會產生殭屍進程。這一點與BSD4不同,BSD4下必須顯式等待子進程結束才能釋放殭屍進程


或者


用兩次fork(),而且使緊跟的子進程直接退出,是的孫子進程成爲孤兒進程,從而init進程將負責清除這個孤兒進程。


linux 如何殺死殭屍進程


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章