1、查看系統是否有僵尸進程
使用Top命令查找,當zombie前的數量不為0時,即系統內存在相應數量的僵尸進程。
2、定位僵尸進程
使用命令ps -A -ostat,ppid,pid,cmd |grep -e ‘^[Zz]’定位僵尸進程以及該僵尸進程的父進程。
3、殺死僵尸進程
使用Kill -HUP 僵尸進程ID來殺死僵尸進程,往往此種情況無法殺死僵尸進程,此時就需要殺死僵尸進程的父進程。
kill -HUP 僵尸進程父ID
然后使用上面第二步的語句查詢該僵尸進程是否被殺死。
4、參數解讀
ps -A -ostat,ppid,pid,cmd |grep -e ‘^[Zz]’
-A 參數列出所有進程
-o 自定義輸出字段 stat(狀態)、ppid(進程父id)、pid(進程id)、cmd(命令)
因為狀態為z或者Z的進程為僵尸進程,所以我們使用grep抓取stat狀態為zZ進程
linux僵尸進程及僵尸進程的處理
僵尸進程
(1)進程中的指令已經執行完成,但是進程PCB結構還沒有回收。
即子進程先于父進程退出后,子進程的PCB需要其父進程釋放,但是父進程并沒有釋放子進程的PCB,這樣的子進程就稱為僵尸進程。
(2)父進程未結束,子進程結束,但父進程沒有處理子進程的退出狀態(當子進程先于父進程結束,父進程沒有獲取子進程的退出碼,子進程的PCB會保留一段時間等待父進程在PCB中獲取退出碼,,且該進程不可執行,此時子進程變成僵尸進程)。
直到父進程獲取到子進程的退出狀態,子進程的PCB才會被移除。
我們的程序在退出的時候:return 0,exit(0),這個0就是退出碼(狀態信息),它存儲在當前進程的PCB中,會有一個整型值來存儲退出碼。
當我們子進程結束以后,會把退出碼寫到PCB中,然后希望父進程可以獲得到這個退出碼,然后父進程就可以看到子進程是正常運行結束還是出錯退出。正常的話我們return 0,失敗的話我們return -1。
僵死進程產生了,會有什么影響?
如果只有一兩個僵死進程,沒有什么影響。
如果有很多個僵死進程,持續不斷的產生,就有影響了,因為子進程的PCB如果沒有被釋放,進程的PID就被一直占著,在內核空間中,PCB本身是結構體,會占用內存空間,對系統軟硬件資源損耗,因此我們要避免僵死進程的產生,父進程有義務去處理!
Linux環境下查看以及殺死僵尸進程
殺死僵尸進程,方法三比較好用,推薦使用
1、查看所有的僵尸進程
ps -A -ostat,pid,ppid | grep -e ‘[zZ]’
例:Z 110 101
這列出了僵尸進程STAT列,進程ID、父進程ID
2、殺死所有僵尸進程
方法一:通過向父進程發送信號方式殺死,這種方法適用用父進程可以處理信號的情況
kill -s SIGCHLD 101
方法二:通過父進程殺死僵尸進程
kill -HUP 僵尸進程父ID
方法三:直接殺死所有僵尸進程
ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk -F“ ” ‘{ print $2 }’ | xargs kill -HUP
審核編輯:黃飛
-
Linux
+關注
關注
87文章
11314瀏覽量
209783 -
進程
+關注
關注
0文章
203瀏覽量
13964 -
PCB
+關注
關注
1文章
1813瀏覽量
13204
發布評論請先 登錄
相關推薦
評論