僵尸进程

僵尸进程(也显示为<defunct>

  1. 僵尸进程 根本不是真正的进程。它们只是内核进程表中的条目。这是他们消耗的唯一资源。它们不消耗任何 CPU 或 RAM
  2. 拥有僵尸的唯一危险是进程表中的空间不足(使用cat /proc/sys/kernel/threads-max来查看系统上限)。
  3. 它们只有在它们的父进程(即fork()它们所在的进程)还活着,但还没有调用wait()系统函数时才会出现。一旦父母死亡,僵尸进程通过init处理。

僵尸进程清理器

#!/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
Last modification:June 25, 2021
如果觉得我的文章对你有用,请随意赞赏