【系統】 殭屍程式

楊奇龍發表於2011-10-15
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]
或者使用如下語句
[root@rac3 ~]# 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 其父程式來解決問題
[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

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-709189/,如需轉載,請註明出處,否則將追究法律責任。

相關文章