一、概述
僵尸进程是怎么产生的
当子进程退出时,父进程没有调用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
本文参考链接: