最近工作過程中,發現好幾臺服務器出現僵死進程(如圖)。
用下面的命令找出僵死進程
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
命令注解:
-A 參數列出所有進程
-o 自定義輸出字段 我們設定顯示字段為 stat(狀態), ppid(進程父id), pid(進程id),cmd(命令)這四個參數
-C 用來指定所執行的命令名稱,你這里也就是讓ps僅僅顯示php命令所產生的進程的信息
ps -C java -o lstart,pid,cmd【不過貌似打印的不全~】
ps -A -o lstart,pid,args |grep java【這個可以的~】
因為狀態為 z或者Z 的進程為僵尸進程,所以我們使用grep抓取stat狀態為zZ進程 運行結果參考如下 
這里一共出現了9個僵死進程,我們需要把它們都干掉,執行下面的命令
kill -9 8310
這時你再執行查找僵死的進程,發現所有僵死進程都沒了.
補充:
最近又遇到了個問題,一臺服務器上產生了100多少僵死進程,而且每一僵死進程的父進程都不一樣,如果用上面的方法,一條一條的殺,那還不得累死我啊。
那么就應該想一條簡單的命令,直接查找僵死進程,然后將父進程殺死~
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9
----------------------------------------------------------------------------------------------------------
不能隨便殺父進程.
ps -aux 先找到僵死進程ID,如5031
lsof -p 5031看看僵死在什么地方,一般地講死鎖在某個文件或關聯在某個進程
去除死鎖文件或殺死相關聯進程先
-----------------------------------------------------------------------------------------------------------
用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
來解決問題