僵尸进程
僵尸进程(也显示为<defunct>
)
- 僵尸进程 根本不是真正的进程。它们只是内核进程表中的条目。这是他们消耗的唯一资源。它们不消耗任何 CPU 或 RAM
- 拥有僵尸的唯一危险是进程表中的空间不足(使用
cat /proc/sys/kernel/threads-max
来查看系统上限)。 - 它们只有在它们的父进程(即
fork()
它们所在的进程)还活着,但还没有调用wait()
系统函数时才会出现。一旦父母死亡,僵尸进程通过init
处理。
僵尸进程清理器
- 这个脚本用于自动清理系僵尸进程
- 核心是向父进程发送
SIGCHLD
- /proc/{pid}/stat 文件定义
#!/bin/bash
zombies=(`ps ax |awk '{print $3" "$1}' |grep -e ^'Z ' |sed 's/Z //1'`)
for zombie in ${zombies[@]}
do
echo "==========="
echo "pid:$zombie"
echo "发现僵尸进程 "`awk '{print $2}' /proc/$zombie/stat`" [pid:$zombie]"
# 第四个是ppid
parent="`awk '{print $4}' /proc/$zombie/stat`"
echo "向父进程 "`awk '{print $2}' /proc/$parent/stat`" [pid:$parent] 请求中..."
kill -SIGCHLD $parent
# 根据实际情况可以适当的修改等待时间
sleep 5
if [ ! -f /proc/$zombie/stat ]; then
echo "清理成功"
else
echo "父进程无响应,可以尝试强制终结父进程"
echo "强制终结指令: kill -9 $parent"
# kill -9 $parent
fi
done
执行效果如下
===========
pid:64066
发现僵尸进程 (sh) [pid:64066]
向父进程 (by_agent) [pid:64038] 请求中...
父进程无响应,可以尝试强制终结父进程
强制终结指令: kill -9 64038