當前位置:首頁 » 操作系統 » linux僵屍

linux僵屍

發布時間: 2022-11-30 08:22:39

1. linux僵屍進程怎麼殺

使用ps -ef查看進程,尋找對應的進程號,然後使用 sudo kill -9 進程號 就可以殺死對應的進程,你還可以使用killall命令,也可以殺死進程

2. linux怎麼處理僵屍進程

一般僵屍進程很難直接kill掉,不過您可以kill僵屍爸爸。父進程死後,僵屍進程成為」孤兒進程」,過繼給1號進程init,init始終會負責清理僵屍進程.它產生的所有僵屍進程也跟著消失。
ps -e -o ppid,stat | grep Z | cut -d」 」 -f2 | xargs kill -9

kill -HUP `ps -A -ostat,ppid | grep -e 』^[Zz]『 | awk 』{print $2}』`
當然您可以自己編寫更好的shell腳本,歡迎與大家分享。
我將nova-novncproxy stop後再start,僵屍進程即消失,問題解決。
另外子進程死後,會發送SIGCHLD信號給父進程,父進程收到此信號後,執行waitpid()函數為子進程收屍。就是基於這樣的原理:就算父進程沒有調用wait,內核也會向它發送SIGCHLD消息,而此時,盡管對它的默認處理是忽略,如果想響應這個消息,可以設置一個處理函數。

3. ubuntu Linux怎麼解決僵屍進程

inux 允許進程查詢內核以獲得其父進程的 PID,或者其任何子進程的執行狀態。例如,進程可以創建一個子進程來執行特定的任務,然後調用諸如 wait() 這樣的一些庫函數檢查子進程是否終止。如果子進程已經終止,那麼,它的終止代號將告訴父進程這個任務是否已成功地完成。
為了遵循這些設計原則,不允許 Linux 內核在進程一終止後就丟棄包含在進程描述符欄位中的數據。只有父進程發出了與被終止的進程相關的 wait() 類系統調用之後,才允許這樣做。這就是引入僵死狀態的原因:盡管從技術上來說進程已死,但必須保存它的描述符,直到父進程得到通知。
如果一個進程已經終止,但是它的父進程尚未調用 wait() 或 waitpid() 對它進行清理,這時的進程狀態稱為僵死狀態,處於僵死狀態的進程稱為僵屍進程(zombie process)。任何進程在剛終止時都是僵屍進程,正常情況下,僵屍進程都立刻被父進程清理了

4. ubuntu Linux怎麼解決僵屍進程

如何查看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 -HUP `ps -A -ostat,ppid | grep -e 』^[Zz]『 | awk 』{print $2}』`

當然您可以自己編寫更好的shell腳本,

5. Linux中的defunct進程(僵屍進程)

一、什麼是defunct進程(僵屍進程)?
在 Linux 系統中,一個進程結束了,但是他的父進程沒有等待(調用wait / waitpid)他,那麼他將變成一個僵屍進程。當用ps命令觀察進程的執行狀態時,看到這些進程的狀態欄為defunct。僵屍進程是一個早已死亡的進程,但在進程表(processs table)中仍佔了一個位置(slot)。
但是如果該進程的父進程已經先結束了,那麼該進程就不會變成僵屍進程。因為每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程,看看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由Init進程來接管他,成為他的父進程,從而保證每個進程都會有一個父進程。而Init進程會自動wait其子進程,因此被Init接管的所有進程都不會變成僵屍進程。
二、 Linux下進程的運作方式
如果子進程先於父進程退出, 同時父進程又沒有調用wait/waitpid,則該子進程將成為僵屍進程。如果該進程的父進程已經先結束了,那麼該進程就不會變成僵屍進程。因為每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程,看看有沒有哪個 進程是剛剛結束的這個進程的子進程,如果是的話,就由Init進程來接管他,成為他的父進程,從而保證每個進程都會有一個父進程。而Init進程會自動 wait其子進程,因此被Init接管的所有進程都不會變成僵屍進程。
每個 Linux進程在進程表裡都有一個進入點(entry),核心進程執行該進程時使用到的一切信息都存儲在進入點。當用 ps 命令察看系統中的進程信息時,看到的就是進程表中的相關數據。當以fork()系統調用建立一個新的進程後,核心進程就會在進程表中給這個新進程分配一個進入點,然後將相關信息存儲在該進入點所對應的進程表內。這些信息中有一項是其父進程的識別碼。
子進程的結束和父進程的運行是一個非同步過程,即父進程永遠無法預測子進程到底什麼時候結束。那麼會不會因為父進程太忙來不及 wait 子進程,或者說不知道子進程什麼時候結束,而丟失子進程結束時的狀態信息呢?
不會。因為 Linux提供了一種機制可以保證,只要父進程想知道子進程結束時的狀態信息,就可以得到。這種機制就是:當子進程走完了自己的生命周期後,它會執行exit()系統調用,內核釋放該進程所有的資源,包括打開的文件,佔用的內存等。但是仍然為其保留一定的信息(包括進程號the process ID,退出碼exit code,退出狀態the terminationstatus of the process,運行時間the amount of CPU time taken by the process等),這些數據會一直保留到系統將它傳遞給它的父進程為止,直到父進程通過wait / waitpid來取時才釋放。
也就是說,當一個進程死亡時,它並不是完全的消失了。進程終止,它不再運行,但是還有一些殘留的數據等待父進程收回。當父進程 fork() 一個子進程後,它必須用 wait() (或者 waitpid())等待子進程退出。正是這個 wait() 動作來讓子進程的殘留數據消失。
三、僵屍進程的危害
如果父進程不調用wait / waitpid的話,那麼保留的那段信息就不會釋放,其進程號就會一直被佔用,但是系統的進程表容量是有限的,所能使用的進程號也是有限的,如果大量的產生僵屍進程,將因為沒有可用的進程號而導致系統不能產生新的進程。
所以,defunct進程不僅佔用系統的內存資源,影響系統的性能,而且如果其數目太多,還會導致系統癱瘓。而且,由於調度程序無法選中Defunct 進程,所以不能用kill命令刪除Defunct 進程,惟一的方法只有重啟系統。
四、如何殺死defunct進程
defunct進程是指出錯損壞的進程,父子進程之間不會再通信。有時,它們會演變成「僵屍進程」,存留在你的系統中,直到系統重啟。可以嘗試 「kill -9」 命令來清除,但多數時候不管用。
為了殺死這些defunct進程,你有兩個選擇:
1.重啟你的計算機
2.繼續往下讀…
我們先看看系統中是否存在defunct進程:
$ ps -A|grep defunct
1
輸出
5259 ? 00:00:00 sd_cicero <defunct>
12214 pts/18 00:01:14 python <defunct>
16989 pts/18 00:04:43 python <defunct>
20610 pts/18 00:23:12 python <defunct>

看看這些進程的ID及其父進程ID:
$ ps -ef | grep defunct | more
UID PID PPID ...
==========================================================================
yourname 4653 6128 0 17:07 pts/18 00:00:00 grep --color=auto defunct
yourname 5259 5258 0 15:58 ? 00:00:00 [sd_cicero] <defunct>
yourname 12214 12211 4 16:41 pts/18 00:01:14 [python] <defunct>
yourname 16989 16986 20 16:45 pts/18 00:04:43 [python] <defunct>
yourname 20610 18940 99 16:48 pts/18 00:23:12 [python] <defunct>

UID:用戶ID
PID:進程ID
PPID:父進程ID
如果你使用命令 「kill -9 12214」 嘗試殺死ID為12214的進程,可能會沒效果。
我們來試一下
ps -A|grep defunct

輸出
5259 ? 00:00:00 sd_cicero <defunct>
12214 pts/18 00:01:14 python <defunct>
16989 pts/18 00:04:43 python <defunct>
20610 pts/18 00:23:12 python <defunct>

進程12214 仍然存才,說明用kill殺不掉它。
要想成功殺死該進程,需要對其父進程(ID為12211)執行kill命令( ps -A | grep defunct)。
我們來試一下
ps -A|grep defunct

輸出
5259 ? 00:00:00 sd_cicero <defunct>
16989 pts/18 00:04:43 python <defunct>
20610 pts/18 00:23:12 python <defunct>
[1] Killed bash main.sh

進程12214消失,說明可以通過kill僵屍進程的父進程來殺死僵屍進程。
如果前一個命令顯示無結果,那麼搞定!否則,可能你需要重啟一下系統。

參考鏈接: https://www.cnblogs.com/lfxiao/p/10837115.html

熱點內容
javaice 發布:2024-03-29 21:56:37 瀏覽:355
編譯圖書 發布:2024-03-29 21:56:36 瀏覽:332
linux全選vi 發布:2024-03-29 21:55:11 瀏覽:773
艾譜保險箱初始密碼一般是什麼 發布:2024-03-29 21:48:11 瀏覽:824
商家粉腳本 發布:2024-03-29 21:34:57 瀏覽:151
我的世界ec伺服器怎麼獲得 發布:2024-03-29 21:21:44 瀏覽:708
小米4設置限制的訪問 發布:2024-03-29 21:21:10 瀏覽:405
linux向伺服器上傳文件 發布:2024-03-29 21:17:20 瀏覽:928
腳本健康cpu佔用率報警 發布:2024-03-29 21:16:42 瀏覽:255
vivox9什麼配置參數 發布:2024-03-29 21:08:09 瀏覽:936