shell脚本--定期清理僵尸进程(临时解决方法)

僵尸进程产生原因了解:

僵尸进程是指完成执行通过exit系统调用,或运行时发生致命错误或收到终止信号所致,但在操作系统进程表中仍然有一个表项,处于“终止状态”的进程。这发生于子进程需要保留表项以允许其父进程读取子进程的exit status:一旦退出态通过wait系统调用读取,僵尸进程条目就从进程表中删除,这个过程被称为reap。正常情况下,进程直接被其父进程wait并由系统回收,进程长时间保持僵尸状态一般是错误的并导致资源泄漏。这个在服务器上的表现是执行top命令后,会看到zombie项数据不为0。

在实际应用中,kill命令对僵尸进程无效。僵尸进程被reap后,其进程号与在进程表中的表项都可以被系统重用。但如果父进程没有调用wait,僵尸进程将保留进程表中的表项,导致资源泄漏。
reap僵尸进程的方式是通过kill命令手工向其父进程发送SIGCHLD信号,如果其父进程仍然拒绝reap僵尸进程,则终止父进程,使得init进程收养僵尸进程。init进程周期执行wait系统调用reap其所收养的所有僵尸进程。

开搞部署僵尸进程清理脚本

1.编写僵尸进程检测脚本

vi killall_zombie.sh

输入如下内容:

#!/bin/bash
zombie_check=`ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'`

if [ -n "$zombie_check" ];
 then
 echo "Start to handle the z0mbie!!!!!"
 for i in `ps aux |grep -w Z |grep -v grep |awk '{print $2}'`
 do
 `ps -ef |grep $i |grep defunct|awk '{print "kill -9 " $2 " "$3}'`
 done
else
 echo "There is no zombie !!!!!"
fi

保存退出。

2.添加设置定时任务

示例:假设脚本名kill_zombie.sh,脚本位置为 /data/scripts/,频率为每一个小时检测一次(时间、脚本位置请自行修改)
crontab -e

0  */1  *  *  *  /shells/kill_zombie.sh 

保存退出。

你可能感兴趣的:(linux,shell)