ps aux | grep 'Z' 或 top -o %MEM 查看状态为 Z 的进程,获取其 PID(进程ID) 和 PPID(父进程ID)。
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /^Z/' 可精准筛选僵尸进程。向父进程发送 SIGCHLD 信号,触发其调用 wait() 或 waitpid() 回收子进程资源:
kill -s SIGCHLD <父进程PID>
适用场景:父进程仍在运行且未正确处理子进程退出。
若父进程无响应或异常,可强制终止父进程(可能导致服务中断,需谨慎):
kill -9 <父进程PID>
僵尸进程会转由 init 进程(PID=1)自动回收。
直接对僵尸进程发送 kill -9 无效,因其已终止。仅当父进程为 init 且无法重启时,可尝试此操作(可能残留进程表项)。
waitpid() 逻辑,或通过 signal(SIGCHLD, SIG_IGN) 忽略子进程退出信号,由系统自动回收。cron)产生,重启对应服务:sudo systemctl restart <服务名>
#!/bin/bash
zombies=$(ps -eo stat | grep -c '^Z')
if [ "$zombies" -gt 0 ]; then
echo "发现 $zombies 个僵尸进程,正在清理..."
ps -eo ppid,pid,cmd | awk '$2 ~ /^Z/ {print $1, $2}' | xargs -n2 kill -9
fi
通过 crontab 设置定时任务(如每小时执行)。kill -9 仅用于极端情况,优先通过信号通知回收。参考来源: