在 CentOS(以及其它 Linux 发行版)中,**僵尸进程(Zombie / defunct 进程)**是指已经结束运行,但父进程还没有调用 wait() 回收其资源的进程。下面介绍几种常用检测和处理方法。
ps 命令ps -ef | grep defunct
或
ps aux | grep Z
更直观一点:
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
说明:
STAT 为 Z 或 Z+ 表示僵尸进程defunct 也代表僵尸ps -eo stat | grep Z | wc -l
或在 top 中查看:
top
顶部有一行类似:
Tasks: 210 total, 1 running, 208 sleeping, 0 stopped, 1 zombie
zombie 即为僵尸进程数量。
pstree 定位来源pstree -p -s <僵尸进程PID>
可以查看是哪个父进程导致其变成僵尸。
ps -o pid,ppid,stat,cmd -p <僵尸PID>
或:
cat /proc/<僵尸PID>/status
⚠️ 僵尸进程本身不能直接 kill
kill -9 <父进程PID>
或重启相关服务:
systemctl restart <服务名>
父进程退出后,僵尸进程会被 init(PID 1)接管并自动回收。
如果是自己写的程序:
wait() / waitpid()SIGCHLD 信号处理子进程退出如果父进程是 PID 1 且一直不回收,可能需要:
❌ kill -9 僵尸PID
✅ 无效,僵尸已经“死”了,只是还没被回收
❌ 僵尸进程占用 CPU / 内存
✅ 基本不占资源,但过多会影响系统稳定性
#!/bin/bash
echo "Zombie processes:"
ps -eo pid,ppid,stat,cmd | awk '$3=="Z" {print}'
如果你愿意,可以贴一下 ps 或 top 的输出,我可以帮你分析是哪个服务导致的僵尸进程。