在 Ubuntu(以及其他 Linux 系统)中,**僵尸进程(Zombie / defunct 进程)**是指已经结束执行、但父进程还没有回收其退出状态的进程。下面介绍几种常见的查看方式。
ps aux | grep ' Z'
或
ps -ef | grep ' Z'
僵尸进程在 STAT 列通常显示为:
Z:僵尸进程Z+:前台僵尸进程示例:
user 1234 1200 0 10:00 ? 00:00:00 [process] <defunct>
ps aux | awk '$8 ~ /Z/ {print $2}'
或者只统计个数:
ps aux | awk '$8 ~ /Z/ {count++} END {print count}'
top
在顶部可以看到:
Tasks: 210 total, 1 running, 208 sleeping, 1 zombie
如果有 zombie > 0,说明存在僵尸进程。
按 f 可以显示更多字段,确认进程状态。
sudo apt install htop
htop
Zfor p in /proc/[0-9]*; do
if [ "$(cat $p/stat 2>/dev/null | awk '{print $3}')" = "Z" ]; then
echo "Zombie PID: $(basename $p)"
fi
done
僵尸进程本身不能被 kill,需要让父进程回收它。
ps -o pid,ppid,stat,comm -p <僵尸PID>
例如:
ps -o pid,ppid,stat,comm -p 1234
然后查看父进程:
ps -p <PPID>
kill -SIGCHLD <父进程PID>
如果父进程异常:
kill <父进程PID>
若无效:
kill -9 <父进程PID>
父进程结束后,僵尸进程会被 init / systemd 接管并回收。
kill -9 僵尸进程如果你愿意,可以把 ps 或 top 的输出贴出来,我可以帮你分析是哪个程序在产生僵尸进程。