在 Debian(以及其它 Linux 发行版)里,僵尸进程(zombie)本质上是“已经结束、但父进程还没回收它”的进程。
所以“产生僵尸进程”不是系统 bug,而是进程编程或shell行为导致的正常现象。
下面按常见场景说明如何在 Debian 上“制造/观察”僵尸进程。
exit()wait() / waitpid()Z)#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
printf("child exit\n");
exit(0);
} else {
// 父进程不回收
sleep(30);
}
return 0;
}
gcc zombie.c -o zombie
./zombie
ps -ef | grep zombie
你会看到类似:
user 12345 12344 0 10:00 ? 00:00:00 [zombie] <defunct>
bash -c 'sleep 1 & exec sleep 30'
sleep 1 是子进程exec 后不 wait如果父进程也死了:
wait()所以:
只有“活着但不回收子进程的父进程”才会长期保留僵尸
wait(NULL);
signal(SIGCHLD, SIG_IGN)systemd / supervisor 管理进程fork() + exec() 时正确回收fork: Resource temporarily unavailable
如果你愿意,我可以:
你想看哪一个?