在 Debian(以及大多数 Linux 系统)中,僵尸进程(Zombie Process)是指已经结束、但其父进程还没有调用 wait() 回收其资源的进程。它们不占用 CPU 或内存,但会占用进程号(PID)。下面介绍几种查找和分析僵尸进程的方法。
toptop
在顶部信息中查看:
Tasks: 210 total, 1 running, 208 sleeping, 0 stopped, 1 zombie
如果看到 zombie 数量 > 0,说明存在僵尸进程。
htop(更直观)sudo apt install htop
htop
Z 状态S(状态)列中可以看到psps aux | awk '$8 == "Z"'
或更直观:
ps -eo pid,ppid,stat,cmd | grep Z
输出示例:
1234 1000 Z [myproc] <defunct>
字段说明:
Z:僵尸状态<defunct>:已失效进程PPID:父进程 ID(关键)ps -ef | grep defunct
僵尸进程不能直接 kill,必须处理其父进程。
ps -o pid,ppid,stat,cmd -p <僵尸PID>
例如:
ps -o pid,ppid,stat,cmd -p 1234
然后查看父进程:
ps -p 1000 -o pid,cmd
常见情况:
systemd、dockerd、java、python)wait() / waitpid()SIGCHLDkill -9 僵尸PID
❌ 无效,因为僵尸进程已经死了
sudo systemctl restart 父进程服务名
或:
kill -HUP 父进程PID
父进程退出后,僵尸进程会被
init(PID 1)接管并自动回收
ps -p 1 -o comm=
systemd,一般不会有问题signal(SIGCHLD, SIG_IGN)(适用于某些场景)systemd 管理服务| 目的 | 命令 |
|---|---|
| 检查是否有僵尸 | top |
| 查看僵尸进程 | ps -eo pid,ppid,stat,cmd | grep Z |
| 查看父进程 | ps -o ppid= -p 僵尸PID |
| 处理僵尸 | 重启父进程 |
| 杀死僵尸 | ❌ 不可行 |
如果你愿意,可以把 ps -ef 或 top 的输出贴出来,我可以帮你具体分析是哪个服务导致的僵尸进程。