温馨提示×

centos僵尸进程怎么查杀

小樊
46
2026-08-19 15:10:11
栏目: 智能运维

CentOS 系统中,僵尸进程(Zombie / Z 状态)是已经结束但父进程还没回收的进程,它们不占用 CPU / 内存,但会占用 PID。
僵尸进程本身不能被直接 kill,只能从父进程入手解决。


一、检查僵尸进程

1️⃣ 查看是否存在僵尸进程

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

或:

top

如果看到:

Tasks: 1 zombie

说明存在僵尸进程。

2️⃣ 查看僵尸进程详情

ps -eo pid,ppid,state,cmd | awk '$3=="Z"'

示例输出:

PID   PPID  STATE CMD
1234  1000  Z     [test.sh] <defunct>

二、僵尸进程为什么杀不掉?

僵尸进程状态是:

Z (zombie)

已经死了
不能被 kill

原因:

  • 子进程已退出
  • 父进程没有调用 wait() / waitpid() 回收

三、正确“查杀”僵尸进程的方法

✅ 方法 1:杀掉父进程(最常用)

假设:

  • 僵尸 PID = 1234
  • 父进程 PID = 1000
kill -9 1000

或先尝试优雅退出:

kill 1000

⚠️ 注意:

  • 杀父进程前确认 不是关键系统进程
  • 父进程退出后,僵尸进程会被 init/systemd 接管并自动清理

✅ 方法 2:重启父进程所属服务(推荐)

如果是服务产生的僵尸进程:

ps -fp 1000

然后重启服务:

systemctl restart 服务名

例如:

systemctl restart httpd
systemctl restart php-fpm

✅ 方法 3:父进程是 init / systemd(PID=1)

如果父进程是 1

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

✅ 通常 重启系统 才能彻底清理
❌ 不建议直接 kill PID 1


四、临时验证是否真的清除了

ps -eo pid,ppid,stat | grep Z

无输出说明僵尸已清除。


五、如何避免频繁出现僵尸进程?

✅ 代码层面(开发者)

  • 父进程正确处理子进程退出:
    • wait() / waitpid()
  • 或使用 signal(SIGCHLD, SIG_IGN)

✅ 运维层面

  • 避免 kill -9 父进程
  • 使用 supervisor / systemd 管理进程
  • 定期监控:
ps -eo stat | grep -c Z

六、快速排查手册(总结)

# 1. 查看僵尸进程
ps -eo pid,ppid,stat,cmd | grep Z

# 2. 找父进程
ps -fp 父PID

# 3. 杀父进程
kill -9 父PID

# 4. 重启服务
systemctl restart 服务名

如果你愿意,可以把 ps -eo pid,ppid,stat,cmd 的输出贴出来,我可以帮你判断该不该杀、杀哪个最安全。

0