在 Ubuntu(以及其他 Linux 发行版)中,僵尸进程(Zombie / defunct 进程)是 kill 不掉的,这是由 Linux 进程模型决定的,不是系统 bug。
下面分点说明原因和正确处理方式。
僵尸进程并不是正在运行的进程,而是:
此时它:
Zkill 只能给“活进程”发信号kill 的本质是:
给进程发送信号
但僵尸进程:
SIGKILL(9)、SIGTERM(15)都无效所以你会看到:
kill -9 12345
# 仍然 ps 显示 Z
这是正常行为。
每个僵尸进程都有父进程(PPID)。
僵尸存在的原因只有一种:
父进程没有调用
wait()/waitpid()回收子进程
常见情况:
找到僵尸的父进程:
ps -l
# 或
ps -eo pid,ppid,stat,cmd | grep Z
假设:
PID PPID STAT CMD
12345 1000 Z [xxx] <defunct>
杀掉父进程:
kill -9 1000
效果:
init(PID 1)或 systemd 收养init 会自动 wait() 回收systemctl restart 服务名
Linux 内核设计原则:
所以:
僵尸只能被“回收”,不能被“杀”
少量僵尸:
大量僵尸(成百上千):
检查 PID 上限:
cat /proc/sys/kernel/pid_max
signal(SIGCHLD, SIG_IGN); // 自动回收
或
waitpid(-1, NULL, WNOHANG);
system() / popen() 时注意回收setsid() 或 daemon() 规范守护进程僵尸进程杀不掉,是因为它已经死了;你真正该杀的是“不负责的父进程”。
如果你愿意,可以把:
ps -ef / ps aux 输出发出来,我可以帮你精确判断该杀哪一个。