在 Ubuntu(及其他 Linux 系统)中,“僵尸进程(Zombie / defunct 进程)”本身是已经结束但未被父进程回收的进程,它不占用 CPU 和内存,但会占用进程表项。定位僵尸进程通常按下面的步骤进行。
toptop
在顶部信息中查看:
Tasks: 210 total, 1 running, 208 sleeping, 0 stopped, 1 zombie
如果有 zombie > 0,说明存在僵尸进程。
ps 查找僵尸进程ps aux | grep Z
或更准确地:
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
示例输出:
PID PPID STAT CMD
12345 1230 Z [python] <defunct>
说明:
STAT=Z 表示僵尸<defunct> 也是僵尸标志僵尸进程无法被 kill,只能由父进程回收。
查看父进程 PID(PPID):
ps -o pid,ppid,stat,cmd -p <僵尸PID>
例如:
ps -o pid,ppid,stat,cmd -p 12345
wait() / waitpid()SIGCHLDsystemctl restart 服务名
如果父进程异常且不回收:
kill -9 父进程PID
父进程死后,僵尸进程会被 init(PID 1)接管并回收。
wait()watch -n 1 'ps -eo pid,ppid,stat,cmd | awk "$3 ~ /Z/"'
如果你愿意,可以把:
ps 输出发出来,我可以帮你分析是哪一个父进程导致僵尸。