在 CentOS(以及所有类 Unix / Linux 系统)中,僵尸进程(Zombie Process)本质上是进程已经结束,但父进程还没有回收它的退出状态时的一种“残留状态”。
下面从原理上给你讲清楚。
在 Linux 中,一个进程结束时会经历这些步骤:
exit() 或收到终止信号wait() / waitpid() 回收子进程✅ 如果父进程及时 wait(),就不会有僵尸进程。
僵尸进程 = 已经死掉,但还没被父进程“收尸”的进程
在 ps 中表现为:
ps -ef
状态列显示:
Z
或
Z+(僵尸+前台)
例如:
user1 12345 12340 0 10:00 ? 00:00:00 [myapp] <defunct>
<defunct> 就是僵尸。
wait()最常见原因,比如:
fork();
// 子进程 exit
// 父进程一直跑,不 wait
例如:
waitwait 一次,但创建了多个子进程kill -9注意:如果父进程死了,子进程会被
init(PID 1)收养,init 会自动wait,一般不会长期僵尸。
✅ 不占 CPU ✅ 不占内存 ❌ 占一个 PID
影响:
因为:
僵尸进程已经死了,kill 不了
kill -9 12345
无效。
只能:
ps -o pid,ppid,stat,cmd -p 僵尸PID
kill -9 父进程PID
僵尸会被 systemd(PID 1)回收。
signal(SIGCHLD, SIG_IGN);
或:
while (waitpid(-1, NULL, WNOHANG) > 0);
CentOS 僵尸进程的本质是:子进程已死,父进程未
wait,内核保留 PID 和退出状态。
如果你愿意,我也可以: