LINUX僵屍進程處理
1 什麼是僵屍進程:
當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程占用的資源,此時子進程將成為一個僵屍進程。如果父進程先退出
,子進程被init接管,子進程退出後init會回收其占用的相關資源。
2 怎樣來清除僵屍進程:
1.改寫父進程,在子進程死後要為它收屍。具體做法是接管SIGCHLD信號。子進程死後,會發送SIGCHLD信號給父進程,父進程收到此信號後,執行waitpid()函數為子進程收屍。這是基於這樣的原理:就算父進程沒有調用wait,內核也會向它發送SIGCHLD消息,盡管對的默認處理是忽略,如果想響應這個消息,可以設置一個處理函數。
2.把父進程殺掉。父進程死後,僵屍進程成為"孤兒進程",過繼給1號進程init,init始終會負責清理僵屍進程.它產生的所有僵屍進程也跟著消失。
3 僵屍進程的危害:
在Unix系統管理中,當用ps命令觀察進程的執行狀態時,經常看到某些進程的狀態欄為defunct,這就是所謂的“僵屍”進程。“僵屍”進程是一個早已死亡的進程,但在進程表(processs table)中仍占了一個位置(slot)。由於進程表的容量是有限的,所以,defunct進程不僅占用系統的內存資源,影響系統的性能,而且如果其數目太多,還會導致系統癱瘓。
這裡介紹linux 環境下的處理僵屍進程的方法:
使用 ps -efl|awk '$2~/Z/{print}' 查找僵屍進程
[root@rac3 ~]# ps -efl|awk '$2~/Z/{print}'
0 Z root 28212 28201 0 85 0 - 0 exit Sep25 ? 00:00:00 [xrdb] <defunct>
或者使用如下語句
[root@rac3 ~]# ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
Z 28201 28212 [xrdb] <defunct>
如果僵屍進程很多可以使用如下語句:
ps -efl | awk '$2~/Z/{print“kill -9 ” $4,$5}'
生成殺進程的腳本。
如果kill子進程的無效,則kill 其父進程來解決問題
[root@rac3 ~]# kill -HUP 28201
[root@rac3 ~]# ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
[root@rac3 ~]# top
top - 19:38:50 up 21 days, 3:42, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 173 total, 2 running, 170 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4044784k total, 3606476k used, 438308k free, 208260k buffers
Swap: 4192956k total, 0k used, 4192956k free, 2689704k cached