在 Debian(以及其他 Linux 发行版)上,僵尸进程(zombie / defunct)本身是已经结束但父进程还没回收的进程,通常不能直接“杀掉”,而是要发现并让父进程回收或重启父进程。下面从监控、排查、处理几个方面说明。
psps aux | grep ' Z'
或只看僵尸:
ps -eo pid,ppid,stat,cmd | awk '$3=="Z"'
top / htoptop 中看 zombie 数量(右上角)htop 中筛选:F4 -> Z
grep zombies /proc/stat
或:
ps -eo stat | grep Z | wc -l
cron + 脚本(简单)创建脚本 /usr/local/bin/check_zombie.sh:
#!/bin/bash
COUNT=$(ps -eo stat | grep -c Z)
if [ "$COUNT" -gt 0 ]; then
echo "Zombie processes: $COUNT" | mail -s "Zombie Alert" root
fi
加执行权限并加入 cron:
chmod +x /usr/local/bin/check_zombie.sh
crontab -e
*/5 * * * * /usr/local/bin/check_zombie.sh
systemd 监控(更专业)可以写一个 systemd timer + service,定期检测并报警(适合服务器)。
proc.num[,,zomb]node_procs_state{zombie="1"}⚠️ 僵尸进程不能直接 kill
ps -eo pid,ppid,stat,cmd | awk '$3=="Z"'
kill -TERM <父进程PID>
# 不行再
kill -KILL <父进程PID>
父进程退出后,僵尸会被 init(PID 1)回收。
wait())SIGCHLDwait() / waitpid()systemd 管理服务,自动回收子进程如果你愿意,我可以:
你可以把 ps -eo pid,ppid,stat,cmd 的输出贴出来。