监控僵尸进程
1 僵尸进程定义
一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程。
2. 2 僵尸进程处理
2.1. 2.1 查看僵尸进程
2.1.1. 2.1.1 使用top
top> Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
2.1.2. 2.1.2 使用ps
ps -ef | grep defunct | grep -v grep | wc -l
> 0
2.2. 2.2 查看僵尸进程pid
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
命令注解:
- -A 参数列出所有进程
- -o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
- grep -e'^[Zz]' 因为状态为 z或者Z 的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
2.3. 2.3 杀死僵尸进程
示例:
直接kill -9 11712(Zombiepid)是没有作用的,原因是:Zombie表示进程已经退出,想要清理这样的进程,需要清除其父进程或者等很长时间后内核将其清除,命令如下
kill -HUP 11741
ps:11741是ppid
2.4. 2.4 自动查杀
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9
命令注解:
-
awk '{print $2}' 打印第二个字段 这里指打印ppid
- xargs kill -9 指将打印出来的ppid依次杀死
当能力支撑不了野心时,就该静下心来学习!