最近工作過(guò)程中,發(fā)現(xiàn)好幾臺(tái)服務(wù)器出現(xiàn)僵死進(jìn)程(如圖)。
用下面的命令找出僵死進(jìn)程
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
命令注解:
-A 參數(shù)列出所有進(jìn)程
-o 自定義輸出字段 我們?cè)O(shè)定顯示字段為 stat(狀態(tài)), ppid(進(jìn)程父id), pid(進(jìn)程id),cmd(命令)這四個(gè)參數(shù)
-C 用來(lái)指定所執(zhí)行的命令名稱,你這里也就是讓ps僅僅顯示php命令所產(chǎn)生的進(jìn)程的信息
ps -C java -o lstart,pid,cmd【不過(guò)貌似打印的不全~】
ps -A -o lstart,pid,args |grep java【這個(gè)可以的~】
因?yàn)闋顟B(tài)為 z或者Z 的進(jìn)程為僵尸進(jìn)程,所以我們使用grep抓取stat狀態(tài)為zZ進(jìn)程 運(yùn)行結(jié)果參考如下 
這里一共出現(xiàn)了9個(gè)僵死進(jìn)程,我們需要把它們都干掉,執(zhí)行下面的命令
kill -9 8310
這時(shí)你再執(zhí)行查找僵死的進(jìn)程,發(fā)現(xiàn)所有僵死進(jìn)程都沒(méi)了.
補(bǔ)充:
最近又遇到了個(gè)問(wèn)題,一臺(tái)服務(wù)器上產(chǎn)生了100多少僵死進(jìn)程,而且每一僵死進(jìn)程的父進(jìn)程都不一樣,如果用上面的方法,一條一條的殺,那還不得累死我啊。
那么就應(yīng)該想一條簡(jiǎn)單的命令,直接查找僵死進(jìn)程,然后將父進(jìn)程殺死~
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9
----------------------------------------------------------------------------------------------------------
不能隨便殺父進(jìn)程.
ps -aux 先找到僵死進(jìn)程ID,如5031
lsof -p 5031看看僵死在什么地方,一般地講死鎖在某個(gè)文件或關(guān)聯(lián)在某個(gè)進(jìn)程
去除死鎖文件或殺死相關(guān)聯(lián)進(jìn)程先
-----------------------------------------------------------------------------------------------------------
用ps和grep命令尋找僵尸進(jìn)程
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
命令注解:
-A 參數(shù)列出所有進(jìn)程
-o 自定義輸出字段 我們?cè)O(shè)定顯示字段為 stat(狀態(tài)), ppid(進(jìn)程父id), pid(進(jìn)程id),cmd(命令)這四個(gè)參數(shù)
因?yàn)闋顟B(tài)為 z或者Z的進(jìn)程為僵尸進(jìn)程,所以我們使用grep抓取stat狀態(tài)為zZ進(jìn)程
運(yùn)行結(jié)果參考如下
Z 12334 12339 /path/cmd
這時(shí),我們可以使用 kill -HUP 12339來(lái)殺掉這個(gè)僵尸進(jìn)程
運(yùn)行后,可以再次運(yùn)行ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'來(lái)確認(rèn)是否已經(jīng)將僵尸進(jìn)程殺死
如果kill 子進(jìn)程的無(wú)效,可以嘗試kill 其父進(jìn)程來(lái)解決問(wèn)題,例如上面例子父進(jìn)程pid是 12334,那么我們就運(yùn)行
kill -HUP 12334
來(lái)解決問(wèn)題