在 Debian(以及所有 Linux 系统)中,僵尸进程(Zombie Process)本质上是已经结束运行、但父进程还没有回收其退出状态的进程。
简单来说:
子进程死了 → 父进程没“收尸” → 子进程变成僵尸
当一个进程退出时:
exit() 结束wait() / waitpid() 读取子进程退出状态在 ps 中通常显示为:
STAT = Z
例如:
1234 user Z 0:00 [subprocess] <defunct>
fork() 但没 wait()这是最常见原因,尤其出现在:
示例(错误写法):
fork();
// 父进程直接返回,不 wait
父进程可能:
导致它永远没机会 wait()
SIGCHLD有些程序为了“不处理子进程”写成:
signal(SIGCHLD, SIG_IGN);
在 某些旧内核/glibc 行为下 仍可能产生僵尸
例如:
systemd 服务被杀supervisor / docker 管理异常子进程变成孤儿 → 被 init(PID 1)接管
如果 PID 1 也没回收,就会变僵尸
常见于:
如果父进程创建太快、回收太慢 → 僵尸堆积
✅ 不占 CPU、不占内存
❌ 但 占用 PID
后果:
fork() 失败ps aux | grep ' Z '
或
top
# 看 Tasks: x zombie
ps -o pid,ppid,stat,cmd -p <僵尸PID>
wait() / waitpid()signal(SIGCHLD, reap_child)system() / popen() 代替手工 fork杀掉父进程(僵尸会交给 PID 1 回收):
kill -9 <父进程PID>
如果是 systemd 服务:
systemctl restart 服务名
Debian 僵尸进程不是“病毒”,而是“父进程没回收子进程”的编程/配置问题。
如果你愿意,可以把:
ps 输出发出来,我可以帮你精准定位是哪一类原因。