Linux 如何找出僵尸进程?对系统有什么影响?

僵尸进程 超通俗说法(Linux 通用,Ubuntu 也一样),在 Ubuntu 26.04 里,僵尸进程(Zombie)的特征是:STAT 列为 Z、命令行带 <defunct>、不占 CPU / 内存,但占进程表项。下面给出最直接、可复制的排查方法。


1. 什么是僵尸进程(Zombie Process)?

简单说:

进程已经死了,但尸体还在进程表里没被收走,就叫僵尸进程。

  • 不占内存
  • 不占 CPU
  • 不会搞崩系统
  • 但会占一个进程号(PID)

状态标识:Z(zombie),日志里会看到 <defunct>


2. 它是怎么产生的?

Linux 进程的死亡流程:

  1. 子进程运行结束 → 内核给它标为 死亡
  2. 子进程会留一个 退出状态码(告诉父进程 “我死了,结果是啥”)
  3. 父进程应该调用 wait() / waitpid() 把状态收走,清理尸体
  4. 如果父进程没去收 → 子进程就变成 僵尸

一句话:

子进程死了,爹没管,就变僵尸。


3. 僵尸进程长什么样?

ps 看:

Z  1234  5678  [nginx] <defunct>
  • Z:僵尸状态
  • 1234:父进程 PID(爹)
  • 5678:僵尸 PID(尸体)
  • <defunct>:已失效,就是僵尸

4. 僵尸进程危险吗?

少量完全无害。

危害只有一种:

僵尸太多,把 PID 号用光了 → 新程序无法启动。

普通服务器几万个 PID,一般很难用光。

只有写得很差的程序、死循环疯狂创建子进程又不回收,才会出问题。


5. 能不能直接 kill 僵尸?

不能!

僵尸已经是死进程了,你再 kill -9 也没用。

它在等爹来收尸,不是等你杀。


6. 正确处理方法(两种)

方法 1:通知父进程去收尸

kill -CHLD 父进程PID

给父进程发信号,提醒它 “你儿子死了,快来收”。

方法 2:杀掉父进程

父进程一死,僵尸会被 init/systemd(PID 1) 收养,系统会自动清理。

kill 父进程PID
# 不行再用
kill -9 父进程PID

7. 孤儿进程 vs 僵尸进程(别搞混)

  • 孤儿进程:爹先死了,儿子还在跑 → 被 systemd 收养,正常运行,不是僵尸
  • 僵尸进程:儿子死了,爹不管 → 尸体留在进程表

8. 一条命令查看所有僵尸

ps -A -o stat,ppid,pid,cmd | grep '^Z'

极简总结

出现一两个不用管,大量出现说明程序写得有 bug

僵尸 = 死了没被收尸的进程

不占资源,少量无害

不能 kill 僵尸,只能杀父进程或通知父进程回收

本文首发于 58Linux技术博客,专注Ubuntu桌面使用、Linux服务器运维与网站搭建实战。

发表评论

粤ICP备10052831号 | © 2026 58Linux 技术笔记. All Rights Reserved. | 联系我们 | 关于本站
本站内容开放共享,仅供学习交流 | 专注 Ubuntu & Linux 实战教程
Built with GeneratePress