導航:首頁 > 操作系統 > linux查看僵屍進程

linux查看僵屍進程

發布時間:2023-11-01 03:30:53

linux進程詳解

ps是Linux 中最基礎的瀏覽系統中的進程的命令。能列出系統中運行的進程,包括進程號、命令、CPU使用量、內存使用量等。接下來解讀一下Linux操作系統的進程和Windows「Ctrl+Alt+delete」直接的差異。

在進行了解進程命令之前需要知道進程的一些狀態

ps工具標識進程的5種狀態碼:

Linux操作系統進程執行的狀態轉換圖如圖所示:

下面來看一下 ps命令
ps --help命令可以查看ps命令的使用說明

或者使用 man ps命令 查詢ps的詳細說明

在 man手冊 關於ps的解讀中,總結了一下幾個參數的含義:

以上的參數是可以拼接使用的,那就了解一些常用的參數組合
ps aux命令

ps -ef命令

查看進程狀態這兩個是命令是最常用的,使用 ps aux 可以查看進程的詳細運行狀態等。使用 ps -ef 不僅可以顯示自身的PID,也可以顯示PPID(父進程)。但是顯示不了進程的運行狀態

top命令
top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況,類似於Windows的任務管理器

man手冊關於top的解釋

關閉進程,重啟進程
在上一片文章中 linux的目錄結構 裡面說過,在目錄/etc/init.d/目錄下包含許多系統各種服務的啟動和停止腳本。假設進程佔用內存較大或者進程異常,我們是重啟這個進程restart。如下圖所示:

我們重啟了mysqld這個進程,可以看出進程號已經改變(從15743到15964),說明進程已經重啟。

Linux下有3個特殊的進程,idle進程(PID=0), init進程(PID=1)和kthreadd(PID=2)

我們來看一下進程狀態[下面是刪減版,進程數量太多,列舉一部分]

可以看到很多進程的PPID號是1和2。也就是init進程和kthreadd進程。

在使用Windows系統的過程中,都碰到過應用程序卡死的情況。應對此問題,我們一般都是等待失去響應的程序恢復,或者是直接使用任務管理器將其強制關閉,然後再重新打開。

在Linux中,遇到特別耗費資源的進程,當然需要使用 top命令 查看進程佔用率高的進程。或者使用 free -m命令 查看內存剩餘。假設需要強殺進程來釋放空間。我們涉及到Linux中信號📶的知識,在這里簡單的描述一下,信號的詳解會在接下來的文章裡面敘述。
free -m命令查看內存空間

在linux中存在著64種信號
使用 kill -l命令 查看信號列表

在前面說過進程會被這些個信號> (進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號強制停止運行) 那問題就在於如何發信號給這些個進程。
使用kill命令發信號

我們從上面可以看到 mysqld進程被重啟了 。

關於Linux的這一塊進程的知識還有很多,後面的文章跟大家分享僵屍進程,孤兒進程等等知識,以及守護進程(daemon進程).

② 【zombie】如何查看並殺死僵屍進程

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()等待子進程結束,又沒有顯式忽略該信號,則子進程成為僵屍進程。

我們可以用top命令來查看伺服器當前是否有僵屍進程,在下圖中可以看到僵屍進程數的提示,如果數字大於0,那麼意味著伺服器當前存在有僵屍進程:

#ps -ef | grep defunct

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

# ps -ef | grep defunct | grep -v grep | awk '{print "kill -18 " $3}'

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

子進程死後,會發送SIGCHLD信號給父進程,父進程收到此信號後,執行waitpid()函數為子進程收屍。就是基於這樣的原理:就算父進程沒有調用wait,內核也會向它發送SIGCHLD消息,而此時,盡管對它的默認處理是忽略,如果想響應這個消息,可以設置一個處理函數。

我們用ps和grep命令尋找僵屍進程:

# ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

命令註解:

-A 參數列出所有進程

-o 自定義輸出欄位 我們設定顯示欄位為 stat(狀態), ppid(進程父id), pid(進程id),cmd(命令)這四個參數

因為狀態為 z或者Z的進程為僵屍進程,所以我們使用grep抓取stat狀態為zZ進程

運行結果參考如下

Z 12334 12339 /path/cmd

這時,我們可以使用 kill -HUP 12339來殺掉這個僵屍進程

運行後,可以再次運行ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'來確認是否將僵屍進程殺死。

如果kill 子進程的無效,可以嘗試kill 其父進程來解決問題,例如上面例子父進程pid是 12334,那麼我們就運行kill -HUP 12334

一條簡單的命令,直接查找僵死進程,然後將父進程殺死

#  ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9

# 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}』)

處理SIGCHLD信號並不是必須的,但對於某些進程,特別是伺服器進程往往在請求到來時生成子進程處理請求。

如果父進程不等待子進程結束,子進程將成為僵屍進程(zombie)從而佔用系統資源。如果父進程等待子進程結束,將增加父進程的負擔,影響伺服器進程的並發性能。

在Linux下 可以簡單地將 SIGCHLD信號的操作設為SIG_IGN。

這樣,內核在子進程結束時不會產生僵屍進程。這一點與BSD4不同,BSD4下必須顯式等待子進程結束才能釋放僵屍進程。

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

③ 如何查找和殺掉Linux中的僵屍進程

Linux 系統中,進程就是一個程序的運行實例。它可能運行在前端(比如有交互的進程),也可能運行在後端(比如無交互或自動運行的進程)。它可能是一個父進程(運行期間創建了其他進程),也可能是一個子進程(由其他進程所創建)。

在 Linux 系統中,除 PID 為 0 的第一個 init 進程(或 systemd )外,其餘進程都有父進程。進程也可以擁有自己的子進程。

你可以通過使用 pstree 命令 來查看進程的樹型結構,你可以清晰的看到各個進程的「家族樹」。

在 Linux 系統中,正常情況下,子進程死亡後其父進程會接收到通知進行一些例如釋放內存之類的清理操作。但是,如果父進程未收到通知察覺子進程死亡,那麼子進程就進入了「僵死」狀態。

這就是僵死進程產生的原因。

僵屍進程並不可怕,少量的僵屍進程對系統影響並不大。但如果系統的內存已經所剩不多或者有太多的僵屍進程在耗掉內存,問題會變得糟糕。

同樣,大部分 Linux 系統進程最大 PID 設置為 32768,如果過多僵屍進程導致其他重要任務沒有 PID 可用,那麼你的系統會發生崩潰。

特別當存在一個編碼糟糕的程序開始大量產生僵屍進程的時候,這種情況經常發生。在這種情況下,我們就需要找到並殺死僵屍進程。

在linux系統中,進程有如下幾種狀態,它們隨時可能處於以上狀態中的一種:

我們可以在命令終端中通過 top命令 來查看系統進程和它的當前狀態。

命令如下:

如上面截圖中看到的,其中共有 250 個任務(進程),其中 1 個處在 「運行中running」 狀態,248 個進程處於 「休眠sleep」 狀態,還有一個處於 「僵屍zombie」 狀態。

現在問題進入下一步,如何殺死 「僵屍」 進程?

僵屍進程對系統來說就是已經死亡的進程,那麼如何殺掉一個已經死亡的進程呢?

方法很簡單,我們只需要通過如下ps命令就可以列舉僵屍進程,得到它們的進程 ID。

ps ux 命令輸出的第 8 列顯示了進程狀態。上述命令將會列印所有處在 Z+ 狀態(表示僵屍狀態)的進程。

確認了進程 ID 後,我們可以得到它的父進程 ID:

你也可以將上述兩個命令結合在一起,直接得到僵屍進程的 PID 及其父進程的 PID:

通過以上命令都可以找到僵屍進程,然後你就可以通過 kill命 令殺掉了。

或者通過如下命令查看僵屍進程:

該命令輸出結果上你可以直接看出其父進程ID,這時候你直接使用kill命令殺掉即可。

再次運行 ps 命令或 top 命令,你可以驗證僵屍進程是否已經被殺死。

通過本文你將認識 Linux 系統中的僵屍進程以及明白了其產生的主要原因。同時,你也能學會如何查找僵屍僵屍進程並殺掉僵屍進程。

當然你也可以自己別寫腳本設置成定時運行任務自動來替你做這些工作。

閱讀全文

與linux查看僵屍進程相關的資料

熱點內容
pdf怎麼摳圖 瀏覽:864
霍妮pdf 瀏覽:808
反編譯VMP 瀏覽:46
hello編譯器 瀏覽:771
apk程序加密 瀏覽:595
如何給app重命名 瀏覽:603
怎麼幽默調侃程序員 瀏覽:285
忘記密碼解壓視頻 瀏覽:911
運城機場春運加密 瀏覽:287
安卓手機如何關閉app後台 瀏覽:154
安卓數字密碼忘記怎麼破解 瀏覽:252
pythonzmq模式 瀏覽:181
linux運行php網站 瀏覽:865
實驗室無油壓縮機 瀏覽:805
哪裡可以免費看動畫app 瀏覽:53
文本加密咋解 瀏覽:485
tomcat做伺服器怎麼設置 瀏覽:252
非對稱加密會增大網路包嗎 瀏覽:703
為什麼不能編譯c 瀏覽:262
數據伺服器不能啟動是什麼意思 瀏覽:556