Unix/Linux 處理殭屍進程的方法

Unix/Linux 處理殭屍進程的方法

1 人贊了文章

找出父進程號,然後kill 父進程,之後子進程(殭屍進程)會被託管到其他進程,如init進程,然後由init進程將子進程的屍體(task_struct)釋放掉。

除了通過ps 的狀態來查看Zombi進程,還可以用如下命令查看:

[oracle@rac1 ~]$ ps -ef|grep defun

oracle 13526 12825 0 16:48 pts/1 00:00:00 grepdefun

oracle 2833028275 0 May18? 00:00:00 [Xsession]<defunct>

殭屍進程解決辦 法:

(1)改寫父進程,在子進程死後要為它收屍。

具體做法是接管SIGCHLD信號。子進程死後,會發送SIGCHLD信號給父進程,父進程收到此信號後,執行 waitpid()函數為子進程收屍。這是基於這樣的原理:就算父進程沒有調用wait,內核也會向它發送SIGCHLD消息,儘管對的默認處理是忽略,如果想響應這個消息,可以設置一個處理函數。

(2)把父進程殺掉。

父進程死後,殭屍進程成為"孤兒進程",過繼給1號進程init,init始終會負責清理殭屍進程.它產生的所有殭屍進程也跟著消失。如:

kill -9 `ps -ef |grep "Process Name" | awk { print $3 }`

其中,「ProcessName」為處於zombie狀態的進程名。

(3)殺父進程不行的話,就嘗試用skill -t TTY關閉相應終端,TTY是進程相應的tty號(終 端號)。但是,ps可能會查不到特定進程的tty號,這時就需要自己判斷了。

(4)重啟系統,這也是最常用到方法之一。

2.6 X (task_dead -exit_dead):退出狀態,進程即將被銷毀

進程在退出過程中也可能不會保留它的task_struct。比如這個進程是多線程程序中被detach過的進 程。或者父進程通過設置sigchld信號的handler為sig_ign,顯式的忽略了sigchld信號。(這是posix的規定,儘管子進程的退出信號可以被設置為sigchld以外的其他信號。)

此時,進程將被置於exit_dead退出狀態,這意味著接下來的代碼立即就會將該進程徹底釋放。所以exit_dead狀態是非常短暫的,幾乎不可能通過ps命 令捕捉到。

三. 進程狀態變化說明

3.1 進程的初始狀態

進程是通過fork系列的系統調用(fork、clone、vfork)來創建的,內核(或內核模塊)也可以通過kernel_thread函數創建內核進程。這些創建子進程的函數本質上都完成了相同的功能——將調用進程複製一份,得到子進程。(可以通過選項參數來決定各種資源是共享、還是私有。)

那麼既然調用進程處於task_running狀態(否則,它若不是正在運行,又怎麼進行調用?),則子進程默認也處於task_running狀態。

另外,在系統調用調用clone和內核函數kernel_thread也接受clone_stopped選項,從而將子進程的初始狀態置為 task_stopped。

3.2 進程狀態變遷

進程自創建以後,狀態可能發生一系列的變化,直到進程退出。而儘管進程狀態有好幾種,但是進程狀態的變遷卻只有兩個方向——從task_running狀態變為非task_running狀態、或者從非task_running狀態變為task_running狀態。

也就是說,如果給一個task_interruptible狀態的進程發送sigkill信號,這個進程將先被喚醒(進入task_running狀態),然後再響應sigkill信號而退出(變為task_dead狀態)。並不會從task_interruptible狀態直接退出。

進 程從非task_running狀態變為task_running狀態,是由別的進程(也可能是中斷處理程序)執行喚醒操作來實現的。執行喚醒的進程設置被喚醒進程的狀態為task_running,然後將其task_struct結構加入到某個cpu的可執行隊列中。於是被喚醒的進程將有機會被調度執行。

而進程從task_running狀態變為 非task_running狀態,則有兩種途徑:

1、響應信號而進入task_stoped狀態、或task_dead狀態;

2、執行系統調用主動進入task_interruptible狀態(如nanosleep系統調用)、或task_dead狀態(如exit系統調用);或由於執行系統調用需要的資源得不到滿足,而進入task_interruptible狀態或task_uninterruptible狀態(如select系統調用)。

顯然,這兩種情況都只能發生在進程正在cpu上執行的情況下。


推薦閱讀:

開發峰易共享系統
技術分析到底有沒有用?
《大話計算機》內容節選之:指令系統和分支預測
筆記本電腦cpu溫度正常範圍是多少呢?
C++性能榨汁機之分支預測器(4)

TAG:操作系統 | Linux | 紅帽認證 |