在 Ubuntu(以及所有 Linux)上,僵尸进程(zombie / defunct)本身是不能被 kill 的,原因是:
僵尸进程已经“死了”,只是还在进程表里留了个壳,等父进程来回收它。
所以你 kill -9 是没用的。
ps -l
如果 STAT 列是 Z,就是僵尸进程。
ps aux | grep Z
僵尸进程只能由 父进程 回收(wait())。
ps -o ppid= -p <僵尸PID>
kill -9 <父进程PID>
父进程死后,僵尸进程会被 init / systemd 接管并自动回收。
⚠️ 注意:
如果是服务产生的僵尸:
systemctl restart 服务名
例如:
systemctl restart nginx
systemctl restart docker
说明代码有问题:
wait() / waitpid()SIGCHLD修复方式(C 示例):
signal(SIGCHLD, SIG_IGN);
或用 waitpid(-1, NULL, WNOHANG)
少量僵尸进程 不影响系统性能,只是占用 PID。 只有在:
cat /proc/sys/kernel/pid_max)时才需要处理。
如果是系统 bug或内核问题:
reboot
这是最后手段。
如果你愿意,可以贴一下:
ps -ef | grep defunct
或者父进程名,我可以帮你判断能不能杀、该杀谁。