在 Debian(以及所有类 Unix/Linux 系统)中,僵尸进程(Zombie Process)本质上是已经结束运行、但还没有被父进程“收尸”的进程。
下面从原理上解释清楚。
当一个进程(子进程)退出时:
exit() 或收到终止信号wait() / waitpid() 读取这些信息✅ 僵尸进程 = 已死,但 PID 还在进程表里
父进程没有调用
wait()回收子进程
常见原因:
wait()wait() 了部分子进程SIGCHLD 信号init / systemd 接管init 正常,会回收init 异常,也可能堆积僵尸ps aux
状态为 Z:
user 1234 0.0 0.0 0 0 ? Z 10:00 0:00 [bash] <defunct>
<defunct> 就是僵尸。
✅ 不占 CPU、不占内存 ❌ 但占 PID
问题:
kill -9 1234
❌ 无效
原因:
kill 只能杀活进程修改程序:
wait(NULL);
或处理 SIGCHLD
kill -9 父进程PID
之后:
init / systemd 接管systemd 会自动 wait() 回收父 -> 子 -> 孙
让孙子被 init 接管,避免僵尸。
僵尸进程是子进程死了,父进程没“收尸”,内核只好保留 PID 等父进程来处理。
如果你愿意,我可以: