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}’ 查找僵屍程序
[[email protected] ~]# ps -efl|awk ‘2~/Z/{print}’
0 Z root 28212 28201 0 85 0 - 0 exit Sep25 ? 00:00:00 [xrdb]
或者使用如下語句
[[email protected] ~]# ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’
Z 28201 28212 [xrdb]
如果僵屍程序很多可以使用如下語句:
ps -efl | awk ‘2~/Z/{print“kill -9 ”4,$5}’
生成殺程序的腳本。
如果kill子程序的無效,則kill 其父程序來解決問題
[[email protected] ~]# kill -HUP 28201
[[email protected] ~]# ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’
[[email protected] ~]# 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
上述方法隻在測試環境實施,如在生産環境,請評估其安全性