在 Debian(其实所有 Linux 系统都一样)里,僵尸进程(Zombie Process)并不是什么“鬼”,而是 Linux 进程机制里的一种正常但特殊的状态。
简单说:
僵尸进程 = 已经死掉的进程,但还没被父进程“收尸”
更准确一点:
Z(zombie)它不占 CPU、不占内存,只占用一点点进程表项(PID)。
核心原因只有一个:
父进程没有调用
wait()/waitpid()来回收子进程
常见场景:
fork() 很多次但从不 wait()ps aux | grep Z
或者:
top
看到状态是 Z 的就是僵尸:
user 12345 0.0 0.0 0 0 ? Z 10:00 0:00 [xxx] <defunct>
defunct 就是“已死”。
一般不大,但也不能忽视:
⚠️ 你不能直接 kill 僵尸进程
因为:
僵尸已经死了,kill 的是活人
kill -CHLD 父进程PID
或者重启父进程:
systemctl restart 父服务
kill -9 父进程PID
父进程死后:
wait() 回收signal(SIGCHLD, SIG_IGN);
或
waitpid(-1, NULL, WNOHANG);
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
或用
subprocess.Popen(..., start_new_session=True)
cmd &
disown
僵尸进程不是病毒,是“没被父进程收尸的死进程”
杀不了,只能让父进程或 init 收尸
如果你愿意,可以把 ps 输出贴出来,我帮你看看是哪个父进程在“养鬼”。