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