在 Ubuntu(以及所有 Linux 系统)中,僵尸进程(Zombie Process) 本身不会直接占用 CPU 或内存,但在数量过多或长期存在时,会对系统产生负面影响。下面从原理到实际影响给你一个清晰说明。
僵尸进程是:
wait() 或 waitpid() 回收它的退出状态在 ps 中通常显示为:
Z
或
<defunct>
例如:
ps aux | grep Z
僵尸进程:
所以 一个或少量僵尸进程通常无害。
每个僵尸进程仍然占用一个 PID。
影响包括:
fork: retry: No child processes
查看最大 PID:
cat /proc/sys/kernel/pid_max
僵尸进程仍保留在 进程表(task_struct) 中:
ps、top 变慢僵尸进程通常是 父进程 Bug 的信号:
SIGCHLDwait()长期存在僵尸进程,往往意味着:
在 Docker / Kubernetes 中:
init(如 tini 没正确配置)结果可能是:
ps aux | awk '$8=="Z" { print }'
或:
top
# 看 Tasks: xxx total, x zombie
ps -eo pid,ppid,stat,cmd | grep Z
如果父进程是:
1(init / systemd) → 多半是父进程已退出僵尸进程 不能被 kill,因为已经死了。
✅ 正确做法:
wait()SIGCHLDkill -9 父进程PID
之后:
init 接管并回收⚠️ 注意:可能影响业务
僵尸进程本身几乎无害,但它通常是系统或程序问题的“症状”,在数量多或容器环境中会造成真实影响。
如果你愿意,我可以帮你: