温馨提示×

centos怎么查杀僵尸进程

小樊
39
2026-10-06 03:48:30
栏目: 智能运维

在 CentOS(以及大多数 Linux 发行版)中,**僵尸进程(Zombie / defunct)**本身是已经结束、但父进程还没“收尸”(调用 wait())的进程。
僵尸进程不占 CPU、内存,只占用一个进程号(PID),通常不能直接 kill 掉。

下面按「排查 → 处理 → 预防」说明。


一、查看僵尸进程

1. 用 top 看整体

top

看这一行:

Tasks: 120 total,   1 zombie

zombie > 0 表示有僵尸进程。

2. 精确找出僵尸进程

ps -ef | grep defunct

或

ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'

示例输出:

PID  PPID STAT CMD
1234 567   Z    [java] <defunct>
  • PID:僵尸进程 ID
  • PPID:父进程 ID(关键)

二、正确处理僵尸进程(核心)

✅ 正确做法:杀父进程

僵尸进程无法直接 kill,只能让其父进程退出或重启

kill -9 PPID

或

kill -TERM PPID

父进程退出后,僵尸进程会被 init(PID 1)接管并清理。


✅ 如果是服务导致的(推荐)

如果是某个服务产生大量僵尸:

systemctl restart 服务名

例如:

systemctl restart httpd
systemctl restart nginx

✅ 极端情况:父进程是 init(PID 1)

一般不会,但如果是:

  • 容器环境
  • 被篡改的 init

只能:

  • 重启服务器
  • 或重启容器

三、常见误区 ❌

操作 是否有效
kill -9 僵尸PID ❌ 无效
killall 僵尸进程名 ❌ 无效
杀父进程 ✅ 有效
重启服务 ✅ 有效

四、如何防止僵尸进程

1. 程序层面(开发)

  • 父进程正确处理 SIGCHLD
  • 调用 wait() / waitpid()
  • 使用 signal(SIGCHLD, SIG_IGN)(某些情况)

2. 运维层面

  • 使用 systemd 管理进程
  • 避免 nohup + & 长期孤儿进程
  • 监控僵尸数量(Zabbix / Prometheus)

五、一键排查脚本(实用)

ps -eo pid,ppid,stat,cmd | awk '$3=="Z" {print "Zombie PID:",$1,"PPID:",$2}'

如果你愿意,可以把:

  • ps -ef | grep defunct 的输出
  • 或 top 截图

发出来,我可以帮你判断具体该杀哪个父进程。

0 踩