Linux 如何清理殭屍程序

2021-07-27 08:08:16 字數 1644 閱讀 8979

今天在維護伺服器的時候,發現有5個nova-novncproxy的殭屍程序。

#

定義:in unix system terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie.

#
在unix 系統中,乙個程序結束了,但是他的父程序沒有等待(呼叫wait / waitpid)他, 那麼他將變成乙個殭屍程序. 在fork()/execve()過程中,假設子程序結束時父程序仍存在,而父程序fork()之前既沒安裝sigchld訊號處理函式呼叫 waitpid()等待子程序結束,又沒有顯式忽略該訊號,則子程序成為殭屍程序。

如何檢視linux系統上的殭屍程序,如何統計有多少殭屍程序?
ps -ef | grep defunct

#
或者查詢狀態為z的程序,z就是代表zombie process,殭屍程序的意思。

另外使用top命令檢視時有一欄為s,如果狀態為z說明它就是殭屍程序。

tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie

top命令中也統計了殭屍程序。

或者使用下面的命令:

ps -ef | grep defunct | grep -v grep | wc -l

如何殺死殭屍程序呢?

一般殭屍程序很難直接kill掉,不過您可以kill殭屍爸爸。父程序死後,殭屍程序成為」孤兒程序」,過繼給1號程序init,init始終會負責清理殭屍程序.它產生的所有殭屍程序也跟著消失。

ps -e -o ppid,stat | grep z | cut -d」 」 -f2 | xargs kill -9

kill -hupps -a -ostat,ppid | grep -e 』^[zz]『 | awk 』』

我將nova-novncproxy stop後再start,殭屍程序即消失,問題解決。

另外子程序死後,會傳送sigchld訊號給父程序,父程序收到此訊號後,執行waitpid()函式為子程序收屍。就是基於這樣的原理:就算父程序沒有呼叫wait,核心也會向它傳送sigchld訊息,而此時,儘管對它的預設處理是忽略,如果想響應這個訊息,可以設定乙個處理函式。

如何避免殭屍程序呢?

處理sigchld訊號並不是必須的。但對於某些程序,特別是伺服器程序往往在請求到來時生成子程序處理請求。如果父程序不等待子程序結束,子程序將成為殭屍程序(zombie)從而占用系統資源。如果父程序等待子程序結束,將增加父程序的負擔,影響伺服器程序的併發效能。在linux下 可以簡單地將 sigchld訊號的操作設為sig_ign。

signal(sigchld,sig_ign);

這樣,核心在子程序結束時不會產生殭屍程序。這一點與bsd4不同,bsd4下必須顯式等待子程序結束才能釋放殭屍程序

或者用兩次fork(),而且使緊跟的子程序直接退出,是的孫子程序成為孤兒程序,從而init程序將負責清除這個孤兒程序。

linux系統清理殭屍程序記錄

在unix 系統中,乙個程序結束了,但是他的父程序沒有等待 呼叫wait waitpid 他,那麼他將變成乙個殭屍程序.在fork execve 過程中,假設子程序結束時父程序仍存在,而父程序fork 之前既沒安裝sigchld訊號處理函式呼叫 waitpid 等待子程序結束,又沒有顯式忽略該訊號,...

Linux如何殺掉殭屍程序

殭屍程序是當子程序比父程序先結束,而父程序又沒有 子程序,釋放子程序占用的資源,此時子程序將成為乙個殭屍程序。如果父程序先退出 子程序被init接管,子程序退出後init會 其占用的相關資源。由於子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法 子程序 到底什麼時候結束.那麼會不會因為父...

殭屍程序和如何刪除殭屍程序

當乙個子程序結束後,他的父程序沒有等待他 wait waitpid 清除他的所有資源時,它就變成乙個殭屍程序。在linux系統中,在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等。但是仍然為其保留一定的資訊 包括程序號the process id,退出狀態the ter...