在 Ubuntu(以及其它 Linux 系统)里,需要先明确一个点:僵尸进程(Zombie / Z 状态)本身不能被直接 kill 掉,因为它已经退出,只是还在进程表里留着一个“尸体”,等父进程来收尸(wait)。
下面按正确思路一步步来。
ps -l
或
ps -ef | grep Z
看到状态是 Z 的就是僵尸进程,例如:
UID PID PPID STAT
1000 1234 1000 Z
关键字段:
PID:僵尸进程 IDPPID:父进程 ID(最重要)僵尸进程只能由 父进程 清理。
kill -TERM PPID
如果父进程不理你:
kill -KILL PPID
父进程死后,僵尸进程会被 init / systemd(PID 1)接管并自动回收。
如果是你自己的程序:
wait() / waitpid()signal(SIGCHLD, SIG_IGN)❌ 以下命令对僵尸进程无效:
kill -9 PID # 对僵尸没用
kill -KILL PID # 没用
因为进程已经死了,只是还没被回收。
如果 PPID = 1:
systemctl restart 对应服务
说明父进程有 bug(比如不断 fork 不 wait):
ps -eo stat,pid,ppid,cmd | grep '^Z'
定位父进程并修复程序。
僵尸进程杀不掉,只能杀父进程或修父进程。
如果你愿意,可以把 ps 输出贴出来,我可以直接帮你判断该杀哪个。