linux對於zombie的處理


@(Linux基礎)[僵屍進程處理]
今天在服務器上推送項目的時候,突然發現很卡。就用top查看了一下,果然此事不簡單啊。

top - 10:39:16 up 20 days, 23:11,  2 users,  load average: 1.13, 1.09, 1.03
Tasks: 204 total,   2 running, 196 sleeping,   1 stopped,   5 zombie
Cpu(s): 22.2%us,  1.9%sy,  0.0%ni, 73.2%id,  1.6%wa,  0.0%hi,  0.0%si,  1.2%st
Mem:   6122764k total,  5311160k used,   811604k free,   785232k buffers
Swap:  2046972k total,   168792k used,  1878180k free,  2787720k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                             
18715 root      20   0  245m  58m 6692 R 31.3  1.0   0:00.94 python                                               
21231 root      20   0  538m  96m 7180 S  1.0  1.6 208:55.76 gunicorn                                             
21237 root      20   0  538m  96m 7272 S  1.0  1.6 208:47.87 gunicorn                                             
21229 root      20   0  539m  97m 7352 S  0.7  1.6 208:57.03 gunicorn                                             
21240 root      20   0  539m  96m 7368 S  0.7  1.6 208:42.90 gunicorn                                             
 2239 rabbitmq  20   0 3768m  69m 2764 S  0.3  1.2  46:00.09 beam.smp                                             
18681 root      20   0 17172 1364  964 R  0.3  0.0   0:00.01 top                                                  
18724 root      20   0  121m 7448 5320 S  0.3  0.1   0:00.01 nginx                                                
    1 root      20   0 21404 1064  848 S  0.0  0.0   0:02.10 init                                                 
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.02 kthreadd                                             

注意:zombie 僵屍進程而且還是5個。
此時此刻,只想說這些這幫人搗亂玩。
解決辦法:
在linux中,利用命令ps,可以看到有標記為Z的進程就是僵屍進程。

ps -ef|grep defunc可以找出僵屍進程.

可以用ps的-l選項,得到更詳細的進程信息. F(Flag):一系列數字的和,表示進程的當前狀態。這些數字的含義為:

00:若單獨顯示,表示此進程已被終止。
  01:進程是核心進程的一部分,常駐於系統主存。如:sched、 vhand 、bdflush 等。
  02:Parent is tracing process.
  04:Tracing parent’s signal has stopped the process; the parent is waiting ( ptrace(S)).
  10:進程在優先級低於或等於25時,進入休眠狀態,而且不能用信號喚醒,例如在等待一個inode被創建時   
  20:進程被裝入主存(primary memory)
  40:進程被鎖在主存,在事務完成前不能被置換

  S(state of the process )

  O:進程正在處理器運行 
  S:休眠狀態(sleeping)
  R:等待運行(runable)   
  I:空閑狀態(idle)
  Z:僵屍狀態(zombie)   
  T:跟蹤狀態(Traced)
  B:進程正在等待更多的內存頁
  C:cpu利用率的估算值(cpu usage)

處理僵屍進程

kill -18 PPID (PPID是其父進程)

 這個信號是告訴父進程,該子進程已經死亡了,請收回分配給他的資源。
 SIGCONT也是一個有意思的信號。如前所述,當進程停止的時候,這個信號用來告訴進程恢復運行。該信號的有趣的地方在於:它不能被忽略或阻塞,但可以被捕獲。缺省行為是丟棄該信號。
終止父進程
 如果方法2不能終止,可采用終止其父進程的方法(如果其父進程不需要的話)父進程死后,僵屍進程成為”孤兒進程”,過繼給1號進程init,init始終會負責清理僵屍進程.它產生的所有僵屍進程也跟着消失。
先看其父進程又無其他子進程,如果有,可能需要先kill其他子進程,也就是兄弟進程。方法是:

  kill –15 PID1 PID2 (PID1,PID2是僵屍進程的父進程的其它子進程)。

然后再kill父進程:kill –15 PPID
這樣僵屍進程就可能被完全殺掉了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM