天天看點

僵屍程序産生和處理

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

上述方法隻在測試環境實施,如在生産環境,請評估其安全性

繼續閱讀