在 Ubuntu(以及其他 Linux 系统)中,僵尸进程(Zombie / defunct) 是已经结束但父进程还没调用 wait() 回收的进程。它们不占 CPU/内存,但会占用 PID。定位和解决通常按下面步骤来。
top
看这一行:
Tasks: 210 total, 1 running, 208 sleeping, 0 stopped, 1 zombie
如果有 zombie > 0,说明存在僵尸进程。
或者用:
ps aux | grep ' Z '
或:
ps -ef | awk '$8=="Z"'
ps -eo pid,ppid,stat,cmd | grep ' Z'
示例输出:
12345 1000 Z [java] <defunct>
字段含义:
PID:僵尸进程 IDPPID:父进程 ID(关键)STAT:Z 表示僵尸僵尸进程不能直接 kill,必须处理它的父进程。
查看父进程信息:
ps -p <PPID> -o pid,ppid,cmd,stat
例如:
ps -p 1000 -o pid,ppid,cmd,stat
常见情况:
systemctl restart 服务名
或:
kill -TERM <PPID>
父进程退出后,僵尸进程会被
init(PID 1)接管并自动回收。
如果是 init / systemd 本身的问题:
sudo systemctl daemon-reexec
kill -9 <僵尸PID>
无效,因为进程已经死了。
SIGCHLDsignal(SIGCHLD, SIG_IGN);
waitpid()systemd 管理服务进程ps -eo pid,ppid,stat,cmd | awk '$3=="Z" {print "Zombie PID:",$1,"PPID:",$2}'
如果你愿意,可以把 ps -ef 或 top 的输出贴出来,我可以帮你直接判断是哪个服务的问题。