在 Debian(以及大多数 Linux 发行版)中,可以通过以下几种方式查看僵尸进程(Zombie / Z 状态进程)。
ps aux | awk '$8 ~ /Z/'
或更直接一点:
ps -ef | awk '$8 == "Z"'
ps -eo pid,ppid,stat,cmd | awk '$3 == "Z"'
示例输出:
1234 1000 Z [test] <defunct>
Z 表示僵尸进程<defunct> 表示已结束但未被父进程回收top
在任务统计区看这一行:
Tasks: 210 total, 1 running, 208 sleeping, 0 stopped, 1 zombie
如果有 zombie > 0,说明存在僵尸进程。
按 f 可以显示 S(状态)列,查看为 Z 的进程。
sudo apt install htop
htop
F4 过滤 Zfor p in /proc/[0-9]*; do
if [ "$(cat $p/stat 2>/dev/null | awk '{print $3}')" = "Z" ]; then
echo "$p"
fi
done
⚠️ 僵尸进程不能直接 kill
僵尸进程已经退出,只是保留 PID 和退出状态,等待父进程 wait()。
ps -eo pid,ppid,stat,cmd | awk '$3 == "Z"'
假设父进程 PID 是 1000
kill -TERM 1000
或
kill -9 1000
父进程退出后,僵尸进程会被 init(PID 1)接管并回收。
SIGCHLDwait())如果你愿意,可以把 ps 或 top 的输出贴出来,我可以帮你判断是哪个进程产生了僵尸。