linux下殭屍進程的發現與處理
- 2020 年 3 月 12 日
- 筆記
一、概述
殭屍進程是怎麼產生的
當子進程退出時,父進程沒有調用wait函數或者waitpid()函數等待子進程結束,又沒有顯式忽略SIGCHLD訊號,那麼它將一直保持在殭屍狀態,如果這時父進程結束了,init進程會自動接收這個子進程,為它收屍,但如果父進程是一個循環,不會結束,那麼子進程就會一直保持僵死狀態。 進程狀態:
- Z 殭屍
- S 休眠
- D 不可中斷的休眠
- R 運行
- T 停止時跟蹤
二、查看殭屍進程
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
命令註解:
- -A 參數列出所有進程
- -o 自定義輸出欄位 我們設定顯示欄位為 stat(狀態), ppid(進程父id), pid(進程id),cmd(命令)這四個參數
因為狀態為 z或者Z 的進程為殭屍進程,所以我們使用grep抓取stat狀態為zZ進程 運行結果參考如下:
root 426489 0.0 0.0 0 0 ? Z 13:58 0:00 [check_haproxy.s] <defunct> root 427159 0.0 0.0 3920 380 ? T 13:59 0:00 /opt/script/check_haproxy.sh root 427161 0.0 0.0 0 0 ? Z 13:59 0:00 [check_haproxy.s] <defunct> root 428023 0.0 0.0 3920 384 ? T 14:00 0:00 /opt/script/check_haproxy.sh root 428025 0.0 0.0 0 0 ? Z 14:00 0:00 [check_haproxy.s] <defunct> root 429389 0.0 0.0 3920 384 ? T 14:02 0:00 /opt/script/check_haproxy.sh root 429390 0.0 0.0 0 0 ? Z 14:02 0:00 [check_haproxy.s] <defunct> root 430245 0.0 0.0 3920 380 ? T 14:04 0:00 /opt/script/check_haproxy.sh root 430247 0.0 0.0 0 0 ? Z 14:04 0:00 [check_haproxy.s] <defunct> root 431136 0.0 0.0 3920 384 ? T 14:06 0:00 /opt/script/check_haproxy.sh root 431137 0.0 0.0 0 0 ? Z 14:06 0:00 [check_haproxy.s] <defunct>
三、殺死殭屍進程
一台伺服器上產生了100多少僵死進程,而且每一僵死進程的父進程都不一樣,如果用
kill -9 進程id
一條一條的殺,那還不得累死我啊。
那麼就應該想一條簡單的命令,直接查找僵死進程,然後將父進程殺死~
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9
本文參考鏈接:
https://www.jianshu.com/p/2fa847da27cb
https://www.cnblogs.com/reality-soul/p/6343339.html