歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> LINUX僵屍進程處理

LINUX僵屍進程處理

日期:2017/3/1 14:42:34   编辑:關於Linux
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
Copyright © Linux教程網 All Rights Reserved