殭屍程序是當子程序比父程序先結束,而父程序又沒有**子程序,釋放子程序占用的資源,此時子程序將成為乙個殭屍程序。如果父程序先退出 ,子程序被init接管,子程序退出後init會**其占用的相關資源。
由於子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法**子程序 到底什麼時候結束. 那麼會不會因為父程序太忙來不及wait子程序,或者說不知道 子程序什麼時候結束,而丟失子程序結束時的狀態資訊呢? 不會。因為unⅸ提供了一種機制可以保證只要父程序想知道子程序結束時的狀態資訊, 就可以得到。這種機制就是: 在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等。但是仍然為其保留一定的資訊(包括程序號the process id,退出狀態the termination status of the process,執行時間the amount of cpu time taken by the process等)。直到父程序通過wait / waitpid來取時才釋放. 但這樣就導致了問題,如果程序不呼叫wait / waitpid的話,那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生殭屍程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免。
在linux作業系統中,輸入top指令就可以檢視
注意看整個介面的第二行,
最後乙個zombie的前面的數字就是代表殭屍程序的數量,這裡我們看到殭屍程序數量不為0,那麼我們需要來清除一下殭屍程序。
接下來需要確定殭屍程序的相關資訊,比如父程序ppid、殭屍程序的pid以及命令列等資訊。可以執行如下命令
ps -e -o stat,ppid,pid,cmd | egrep '^[zz]'
說明:
然後可以kill -9 父程序pid,假設父程序pid為 9635
kill -9 9635
現在大多數linux系統,也會將殭屍程序標識為defunct,所以你也可以通過如下命令來獲取殭屍程序資訊。
ps -ef | grep "defunct"
一般來說先用kill命令傳送強制終止的資訊,結束子程序。如下圖所示,這時候子程序是沒有辦法結束的。
所以,這時候需要用kill -9來強制終止父程序。
殺死父程序之後可以再次用top命令來看
上面的方法是通過結束父程序從而結束殭屍程序,這只能算是乙個比較理想的情況 ,很多時候遇到殭屍程序我們不能結束父程序,比如父程序是init程序,那一旦結束父程序,整個系統就掛掉了,這時候則可以考慮掛起子程序,這相當於「曲線救國」。乙個程序一旦掛起就相當於「什麼都不做了」。可以通過執行如下命令來掛起程序。
kill -hup 程序pid
kill -hup 2563
zz ↩︎ 檢視殭屍程序並殺掉殭屍程序
在運維過程中,我們經常會碰到機器由於某幾個特殊的殭屍程序造成整台伺服器上的程序異常卡死,負載變高。例如以下 其中,存在8個殭屍程序,並且程序19712的cpu使用異常。檢視具體的殭屍程序有哪些 發現這些子殭屍程序的父程序即為19712程序。其對應的其實就是namenode程序 解決辦法 1 如果業務...
Linux尋找和殺掉殭屍程序
linux伺服器上,多少會出現一些殭屍程序,下面介紹如何快速尋找和消滅這些殭屍程序的方法 首先,我們可以用top命令來檢視伺服器當前是否有殭屍程序,在下圖中可以看到殭屍程序數的提示,如果數字大於0,那麼意味著伺服器當前存在有殭屍程序 下面,我們用ps和grep命令尋找殭屍程序 ps a ostat,...
linux如何徹底殺掉uwsgi程序
在啟動uwsgi時,如果指定了pid,可以通過pid停止uwsgi 如果沒指定,直接kill uwsgi的程序id,會導致uwsgi重啟,無法關閉成功 通過ps,檢視uwsgi相關程序 ps aux grep uwsgi kill pid會傳送sigterm,只會導致重啟,而不是結束掉。需要傳送si...