当子进程退出时,父进程没有调用wait函数或者waitpid()函数等待子进程结束,又没有显式忽略SIGCHLD信号,那么它将一直保持在僵尸状态,如果这时父进程结束了,init进程会自动接收这个子进程,为它收尸,但如果父进程是一个循环,不会结束,那么子进程就会一直保持僵死状态。 进程状态:
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
命令注解:
因为状态为 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
本文参考链接: