在 Ubuntu(及其他 Linux 发行版)中,“僵尸进程(Zombie / defunct 进程)”是已经结束执行、但其父进程尚未调用 wait() 回收其退出状态的进程。统计僵尸进程主要从查看数量和定位来源两方面入手。
psps aux | awk '$8 ~ /Z/ {print $0}' | wc -l
或更直接:
ps -eo stat | grep Z | wc -l
说明:
Z 表示僵尸状态wc -l 统计行数(即僵尸进程数)toptop
在顶部可以看到:
Tasks: 250 total, 1 running, 248 sleeping, 0 stopped, 1 zombie
其中 zombie 就是僵尸进程数量。
htop(需安装)sudo apt install htop
htop
僵尸进程通常显示为灰色,并标注 Z。
ps -eo pid,ppid,stat,comm | awk '$3 == "Z"'
示例输出:
1234 1000 Z java
PID:僵尸进程 IDPPID:父进程 ID(关键)僵尸进程无法被 kill,只能由父进程回收。
查看父进程信息:
ps -p <PPID> -o pid,ppid,cmd
如果父进程是你自己的程序:
wait() / waitpid()如果父进程是 init / systemd(PID 1):
✅ 正常情况:
⚠️ 异常情况:
解决方式:
sudo systemctl restart <service>
kill -9 <PPID>(谨慎)#!/bin/bash
count=$(ps -eo stat | grep -c Z)
echo "$(date) Zombie count: $count" >> /var/log/zombie.log
加入 cron:
* * * * * /path/to/script.sh
如果你愿意,可以贴出:
ps -eo pid,ppid,stat,comm | awk '$3=="Z"'
的输出,我可以帮你分析具体原因。