在 Linux/Unix 系统中,**僵尸进程(Zombie Process,也叫僵死进程)**是指:一个子进程已经结束运行,但其父进程还没有调用 wait() / waitpid() 来回收它的退出状态,导致该进程在进程表中仍占用一个条目。
简化过程如下:
fork() 创建子进程wait() 回收在 ps 中通常显示为:
STAT=Z
例如:
12345 pts/0 Z+ 0:00 [test] <defunct>
✅ 已经不占用 CPU、内存等资源
✅ 只是占着一个进程表项(PID)
❌ 无法被 kill -9 杀死(因为它已经“死”了)
一般情况下危害不大,但:
/proc/sys/kernel/pid_max)ps -ef | grep defunct
或:
top
看 Tasks: x total, y zombie
父进程应:
wait(NULL);
或使用:
signal(SIGCHLD, SIG_IGN);
解决办法:
kill -9 父进程PID
之后僵尸进程会被 init(PID 1)接管并回收
例如:
systemctl restart xxx
SIGCHLDwaitpid() 非阻塞回收signal(SIGCHLD, SIG_IGN);
僵尸进程是“已经死了,但父进程没办丧事”的进程。
如果你愿意,我也可以:
孤儿进程 vs 僵尸进程