温馨提示×

ubuntu 什么是僵尸进程

小樊
46
2026-08-11 22:44:50
栏目: 智能运维

在 Ubuntu(以及所有 Linux 系统)中,僵尸进程(Zombie Process) 是一个已经结束运行、但还没有被父进程回收的进程。


一、什么是僵尸进程?

僵尸进程是:

  • 已经终止(exit)的进程
  • 仍然保留在进程表中
  • 不占用 CPU、内存等资源
  • 只保留一个进程号(PID)和退出状态

它不会真正“运行”,但也不会立刻消失。


二、为什么会产生僵尸进程?

在 Linux 中,子进程退出后,父进程需要调用 wait()waitpid() 来:

  • 获取子进程的退出状态
  • 回收子进程的进程表项

如果 父进程没有回收子进程,子进程就会变成僵尸进程。

简单流程

子进程 exit()
   ↓
内核保存退出状态
   ↓
父进程未调用 wait()
   ↓
子进程变成僵尸进程(Z 状态)

三、僵尸进程的状态标志

pstop 中,僵尸进程的状态是:

Z

例如:

ps aux | grep Z

或:

ps -eo pid,ppid,stat,cmd | grep Z

输出示例:

1234  1000 Z  [bash] <defunct>

<defunct> 表示“已失效”。


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

不会占用 CPU
不会占用内存
会占用 PID

潜在问题

  • 如果大量僵尸进程积累:
    • 可能 耗尽 PID 空间
    • 影响系统创建新进程

五、如何查看僵尸进程?

1️⃣ 查看僵尸进程数量

ps aux | awk '$8=="Z" { print }'

或:

top

Tasks 行中可以看到:

Tasks: 120 total, 1 running, 118 sleeping, 0 stopped, 1 zombie

六、如何清理僵尸进程?

⚠️ 不能直接 kill 僵尸进程

因为:

  • 僵尸进程已经死了
  • kill -9 没用

✅ 正确做法

方法 1:让父进程回收(推荐)

找到僵尸进程的父进程:

ps -eo pid,ppid,stat,cmd | grep Z

然后:

  • 重启或修复父进程
  • 或向父进程发送 SIGCHLD
kill -SIGCHLD 父进程PID

如果父进程仍然不处理,只能:

方法 2:杀掉父进程

kill 父进程PID

父进程死后:

  • 僵尸进程会被 init(或 systemd,PID 1)接管
  • init 会自动回收

七、如何避免僵尸进程?

✅ 在程序中

  • 父进程调用 wait() / waitpid()
  • 或使用 signal(SIGCHLD, SIG_IGN) 自动回收

✅ 在 shell 中

  • 避免长期运行脚本不处理子进程退出状态

八、一句话总结

僵尸进程是“已经死掉但还没被收尸的进程”,问题通常出在父进程,而不是子进程本身。

如果你愿意,我可以:

  • 帮你分析你系统上的僵尸进程
  • 给你一个 C / Python / Shell 的示例
  • 解释 init / systemd 如何回收僵尸进程

0