ps -A -o stat,ppid,pid,cmd | grep -e '[Zz]'top 命令查看 zombie 列。终止父进程(推荐)
找到僵尸进程的父进程PID,执行 kill -9 父进程PID,僵尸进程会被 init 进程(PID=1)接管并清理。
注意:优先尝试正常终止(如 kill 不加 -9),避免数据丢失。
手动清理(特殊情况)
若父进程已终止但僵尸仍存在,可尝试 kill -9 僵尸进程PID,但可能无法彻底解决。
信号处理
向父进程发送 SIGCHLD 信号,强制其回收子进程:
kill -SIGCHLD 父进程PID。
重启父进程
若父进程为服务,可通过 systemctl restart 服务名 重启,清理所有子进程。
父进程正确处理子进程:
在代码中调用 wait() 或 waitpid() 回收子进程资源。
设置信号处理函数捕获 SIGCHLD,自动调用回收函数。
避免忽略信号:
勿在父进程中忽略 SIGCHLD 信号(如 signal(SIGCHLD, SIG_IGN)),可能导致僵尸积累。
定期监控
通过 cron 定时任务运行检测脚本,自动清理僵尸进程。
示例脚本:
#!/bin/bash
zombies=$(ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | wc -l)
if [ $zombies -gt 0 ]; then
echo "$(date) 发现 $zombies 个僵尸,开始清理" >> /var/log/zombie.log
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -HUP
fi