目錄表
[*nix] Handle Zombie Process
0x00 前言
Zombie Process 是 *nix 中一種特別的 process status
剛剛寫完了 [*nix] Resources Monitor: Top Command 這篇
本來想把 Zombie Process 一併寫進去
但想想內容篇幅,還是決定另開主題寫一篇
0x01 What’s a Zombie Process?
基本上來說 Zombie Process 就是當程序結束後,它的 exit status 沒有適當地被他的 parent process 處理,導致該 process 雖已結束,但 process 資料卻沒辦法完全的從記憶體中清除
在 Linux 上頭,當 Process 結束時,資料並不會馬上全部從記憶體中移除,他的 process descriptor 會留在記憶體中(佔用空間不多)
此時 Process 會變成 EXIT_ZOMBIE 的狀態,並發送 SIGCHLD signal 給 parent process
這時候 parent process 應該要呼叫 wait() system call 來讀取 child process 的 exit status 及其他資訊
在這個流程後,child process 才會被完全從記憶體清除
一般來說這個流程非常迅速,所以正常狀況下我們不太會在 top 指令中看到 zombie
然而,若 parent process 沒有正確呼叫 wait() system call,這些 zombie children 就會卡在 memory 之中了
0x02 Dangers of Zombie Processes
Zombie 佔用的記憶體空間其實並不多
比較大的影響是 PID 在 Linux 中是有限的,而 zombie process 佔用了 PID 沒有被釋放
所以少數的 zombie process 是不影響系統的,除非 zombie process 不斷增加,耗盡了系統 PID
0x03 Getting Rid of Zombie Processes
面對 zombie process 我們是無法透過 SIGKILL signal (kill -9) 來將其結束的,因為 zombie process 本來就是結束的狀態
我們的第一個方法是透過送 SIGCHLD 給 parent process 來處理
% kill -s SIGCHLD parent_pid
然而,在 parent process 不處理 SIGHLD 或設計不良下,這個方法是沒有效的
取而代之我們能做的是 kill parent process,此時 child process 就會變成孤兒,被 init process 接管 (init 成為新 parent)
這時 init 就會去做 wait() system call 來處理 zombie process 的 exit status 和其他資料,並清除掉 zombie process 了