在 Debian(以及其它 Linux 发行版)中,僵尸进程(Zombie / defunct)本质上是已经结束、但父进程还没调用 wait() 回收其资源的进程。下面给你几种查看和判断僵尸进程的方法。
ps aux | awk '$8 ~ /Z/'
或
ps -ef | awk '$8 ~ /Z/'
说明:
Z 表示进程状态为 ZombieSTAT 列显示 Z 或 Z+示例输出:
user 1234 0.0 0.0 0 0 ? Z 10:00 0:00 [process] <defunct>
ps -eo pid,ppid,stat,cmd | grep ' Z'
top
在顶部看:
Tasks: 210 total, 1 zombie
如果有 zombie > 0,说明系统中有僵尸进程。
按 f → 选 STAT 可显示状态
sudo apt install htop
htop
for p in /proc/[0-9]*; do
if [ "$(cat $p/stat 2>/dev/null | awk '{print $3}')" = "Z" ]; then
echo "$p is zombie"
fi
done
⚠️ 你不能直接 kill 僵尸进程
kill -9 <pid> # 对僵尸进程无效
ps -eo pid,ppid,stat,cmd | grep Z
找到 PPID(父进程 ID),然后:
kill -9 <PPID>
父进程死后,僵尸进程会被 init / systemd 收养并清理。
如果是服务产生的僵尸:
systemctl restart <service>
SIGCHLDwait() / waitpid()如果你愿意,可以贴出:
ps -eo pid,ppid,stat,cmd | grep Z
我可以帮你分析是哪个程序导致的。