在 Ubuntu(以及其他 Linux 发行版)中,**僵尸进程(Zombie Process)**是指已经结束运行、但其父进程还没有调用 wait() 或 waitpid() 来回收其退出状态的进程。僵尸进程本身不占用 CPU 和内存,但会占用进程表项(PID),过多时可能导致系统无法创建新进程。
下面从如何判断和如何处理两方面说明。
ps 命令最常用的方法:
ps aux | grep Z
或更准确地看进程状态:
ps -eo pid,ppid,stat,cmd | grep '^.* Z'
僵尸进程在 STAT 列会显示:
Z:僵尸进程Z+:前台僵尸进程示例输出:
1001 999 Z [python] <defunct>
说明:
1001:僵尸进程 PID999:父进程 PID(PPID)<defunct> 表示已死但未回收top / htoptop
查看 S(状态)列,出现 Z 即为僵尸进程;
顶部还会显示:
Tasks: 210 total, 1 zombie
sudo apt install htop
htop
僵尸进程通常显示为灰色,状态为 Z。
ps aux | awk '$8 ~ /Z/ {print}'
或:
cat /proc/stat | grep procs_zombie
wait()不能直接 kill 僵尸进程:
kill -9 <zombie_pid> # 无效
必须通过其父进程来处理。
kill -9 <父进程PID>
示例:
kill -9 999
父进程死后,僵尸进程会被 init(PID 1)接管并自动回收。
如果是你自己写的程序:
wait() / waitpid()subprocess 并正确 join()& 后不 wait若是系统服务产生僵尸:
systemctl restart <service>
如果你愿意,可以把 ps 或 top 的输出贴出来,我可以帮你具体分析是哪个程序产生了僵尸进程。