在 Debian(以及所有 Linux 系统)中,僵尸进程(zombie process)并不是“被杀死的进程”,而是已经结束、但父进程还没有回收其退出状态的进程。
根本原因是:
子进程已退出,父进程没有调用
wait()/waitpid()回收它
具体流程如下:
ps 查看时显示为 Z 或 <defunct>SIGCHLDwait() / waitpid()示例(C):
pid_t pid = fork();
if (pid == 0) {
exit(0); // 子进程退出
}
// 父进程什么都不做 → 僵尸
wait()SIGCHLDSIGCHLD 处理函数写错signal(SIGCHLD, SIG_IGN); // 某些实现下不会自动收尸
init(PID 1)接管init 会定期 wait()wait() 能力常见于:
bash 作为 PID 1ps aux | grep Z
或:
ps -eo pid,ppid,stat,cmd | grep Z
输出示例:
1234 1000 Z [myapp] <defunct>
Z:僵尸状态fork: retry: No child processes
pid_t pid = fork();
if (pid == 0) {
exit(0);
} else {
waitpid(pid, NULL, 0);
}
void handler(int sig) {
while (waitpid(-1, NULL, WNOHANG) > 0);
}
signal(SIGCHLD, handler);
kill -9 父进程PID
tini / dumb-initdocker run --init ...
Debian 上的僵尸进程不是系统 bug,而是父进程没有回收子进程的退出状态造成的。
如果你愿意,可以把:
ps -eo pid,ppid,stat,cmd贴出来,我可以帮你分析 具体是哪个程序在制造僵尸进程。