在 Ubuntu 系統中,僵尸進程(Zombie Process)通常是由于父進程未能正確處理子進程的結束狀態而形成的。以下是詳細的解釋:
SIGCHLD
信號,通知父進程它已經結束。wait()
或 waitpid()
系統調用來讀取子進程的退出狀態并回收其資源,子進程就會變成僵尸進程。這是因為子進程的資源(如內存、文件描述符等)已經被釋放,但其進程控制塊(PCB)仍然保留在系統中,以保存一些信息(如退出狀態、CPU 使用時間等)。可以使用 ps
命令來查看當前系統中的進程信息,找出狀態為 “Z”(僵尸狀態)的進程。例如:
ps aux | grep 'Z'
ps -o ppid -p 僵尸進程ID
命令來查看僵尸進程的父進程 ID。kill -s SIGCHLD 父進程ID
命令發送 SIGCHLD
信號給父進程,通知它一個子進程已經結束,父進程收到信號后會再次調用 wait()
或 waitpid()
函數,從而回收僵尸進程的資源。wait()
或 waitpid()
函數,以便回收子進程的資源。SIGCHLD
信號的處理來自動回收子進程。通過設置信號處理函數,父進程可以在接收到 SIGCHLD
信號時調用 wait()
,回收子進程。init
進程(進程號為 1)接管。init
進程會自動回收所有孤兒進程,避免僵尸進程的產生。通過以上方法,可以有效地清理 Ubuntu 系統中的僵尸進程,并防止它們的出現。