温馨提示×

debian怎么产生僵尸进程

小樊
40
2026-09-01 23:47:43
栏目: 智能运维

在 Debian(以及其它 Linux 发行版)里,僵尸进程(zombie)本质上是“已经结束、但父进程还没回收它”的进程
所以“产生僵尸进程”不是系统 bug,而是进程编程或shell行为导致的正常现象。

下面按常见场景说明如何在 Debian 上“制造/观察”僵尸进程。


一、最简单:C 程序制造僵尸进程

原理

  • 子进程 exit()
  • 父进程 不调用 wait() / waitpid()
  • 子进程变成僵尸(状态 Z

示例代码(zombie.c)

#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>

二、Shell 中“临时”产生僵尸(不推荐但可见)

bash -c 'sleep 1 & exec sleep 30'
  • sleep 1 是子进程
  • 父进程 exec 后不 wait
  • 短时间内会出现僵尸

三、父进程死掉后僵尸去哪了?

如果父进程也死了:

  • 僵尸会被 init / systemd (PID 1) 收养
  • systemd 会自动 wait()
  • 僵尸立刻消失

所以:

只有“活着但不回收子进程的父进程”才会长期保留僵尸


四、怎么避免僵尸进程(补充)

  1. 父进程调用:
    wait(NULL);
    
  2. 使用 signal(SIGCHLD, SIG_IGN)
  3. systemd / supervisor 管理进程
  4. 使用 fork() + exec() 时正确回收

五、僵尸进程的危害

  • 不占 CPU、不占内存
  • 占用 PID
  • 大量僵尸会导致:
    fork: Resource temporarily unavailable
    

如果你愿意,我可以:

  • 给你 systemd 服务产生僵尸的例子
  • 或讲 如何用 /proc 分析僵尸
  • 或演示 如何“杀不掉”僵尸(以及为什么)

你想看哪一个?

0