温馨提示×

什么是linux僵尸进程

小樊
34
2026-09-06 15:32:56
栏目: 智能运维

在 Linux/Unix 系统中,**僵尸进程(Zombie Process,也叫僵死进程)**是指:一个子进程已经结束运行,但其父进程还没有调用 wait() / waitpid() 来回收它的退出状态,导致该进程在进程表中仍占用一个条目


一、僵尸进程是怎么产生的?

简化过程如下:

  1. 父进程 fork() 创建子进程
  2. 子进程运行结束(正常退出或被信号终止)
  3. 子进程进入终止状态,但:
    • 它仍然保留:
      • 进程号(PID)
      • 退出码
      • 一些统计信息
  4. 父进程没有及时 wait() 回收
  5. 此时子进程变成 僵尸进程(Zombie)

ps 中通常显示为:

STAT=Z

例如:

12345 pts/0 Z+ 0:00 [test] <defunct>

二、僵尸进程的特点

已经不占用 CPU、内存等资源
只是占着一个进程表项(PID)
无法被 kill -9 杀死(因为它已经“死”了)


三、僵尸进程有什么危害?

一般情况下危害不大,但:

  • 大量僵尸进程会:
    • 耗尽 PID 资源(/proc/sys/kernel/pid_max
    • 导致系统无法创建新进程
  • 说明父进程设计有问题

四、如何查看僵尸进程?

ps -ef | grep defunct

或:

top

Tasks: x total, y zombie


五、如何处理僵尸进程?

✅ 正确做法:让父进程回收

父进程应:

wait(NULL);

或使用:

signal(SIGCHLD, SIG_IGN);

✅ 如果父进程写错了(不回收)

解决办法:

1. 杀掉父进程(最常见)

kill -9 父进程PID

之后僵尸进程会被 init(PID 1)接管并回收

2. 重启相关服务

例如:

systemctl restart xxx

六、如何避免产生僵尸进程?

  • 父进程正确处理 SIGCHLD
  • 使用 waitpid() 非阻塞回收
  • 或显式忽略子进程退出:
signal(SIGCHLD, SIG_IGN);

七、一句话总结

僵尸进程是“已经死了,但父进程没办丧事”的进程。

如果你愿意,我也可以:

  • 用 C / Python 示例演示僵尸进程
  • 孤儿进程 vs 僵尸进程
  • 分析你服务器上的具体僵尸问题

0