在 Ubuntu(以及其它 Linux 发行版)中,“僵尸进程(Zombie Process)”是指已经结束执行,但其父进程还没有调用 wait() 回收其退出状态的进程,状态通常显示为 Z。
下面介绍几种查看和处理僵尸进程的方法。
ps 命令(最常用)ps aux | grep Z
或只看状态列:
ps -eo pid,ppid,stat,cmd | awk '$3=="Z"'
僵尸进程的状态通常是:
STAT = Z
示例输出:
USER PID PPID STAT COMMAND
root 1234 567 Z [python] <defunct>
top / htoptop
在 top 中查看:
f → 确保显示 S(状态)Z 的即为僵尸进程或使用更直观的工具:
htop
(Ubuntu 默认未安装,可用 sudo apt install htop)
ps aux | awk '$8=="Z"' | wc -l
或在 /proc 中统计:
cat /proc/stat | grep procs
PID :僵尸进程 ID
PPID :父进程 ID(关键)
STAT :Z 表示僵尸
CMD :原进程名(通常带 <defunct>)
⚠️ 注意:
你不能直接 kill 僵尸进程,因为它已经死了。
只能通过其父进程来解决。
找到父进程:
ps -o ppid= -p <僵尸PID>
然后:
sudo systemctl restart 服务名
kill -TERM <PPID>
父进程退出后,僵尸进程会被
init(PID 1)接管并自动回收。
如果 PPID = 1,但仍有僵尸:
ps -o pid,ppid,stat,cmd -p 1
通常是系统 bug,建议:
如果你是开发者:
wait() / waitpid()signal(SIGCHLD, SIG_IGN) 自动回收子进程systemd 管理服务进程# 查看僵尸进程
ps -eo pid,ppid,stat,cmd | awk '$3=="Z"'
# 查看父进程
ps -o ppid= -p <PID>
# 重启父进程服务
sudo systemctl restart <service>
如果你愿意,可以把 ps 输出贴出来,我可以帮你分析具体是哪个服务导致的。