linux下僵屍進程的發現與處理


一、概述

 

僵屍進程是怎么產生的

當子進程退出時,父進程沒有調用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM