在 CentOS(以及其它 Linux 发行版)中,**僵尸进程(Zombie / defunct 进程)**本质上是已经结束运行、但父进程还没有调用 wait() 回收其退出状态的进程。它们不占用 CPU 和内存,但会占用进程号(PID),过多时可能影响系统。
下面按「查看 → 原因 → 处理方法 → 预防」来说明。
ps -ef | grep defunct
# 或
ps aux | awk '$8 ~ /Z/'
也可以看系统整体僵尸数:
top
# 看 Tasks: xxx total, x zombie
或:
cat /proc/loadavg
✅ 僵尸进程无法直接 kill
kill -9 <pid> # 对僵尸进程无效
因为:
查看僵尸进程的父进程:
ps -ef | grep defunct
# 或
ps -o pid,ppid,stat,cmd -p <僵尸PID>
假设父进程 PID 是 1234
systemctl restart 服务名
# 或
kill -TERM 1234
父进程退出后:
init / systemd(PID 1)接管wait() 清理如果父进程无重要业务:
kill -9 1234
⚠️ 注意:
如果是自写程序导致:
SIGCHLDwaitpid() / fork() + exec()示例(C):
signal(SIGCHLD, SIG_IGN); // 自动回收子进程
Python:
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
| 场景 | 说明 |
|---|---|
| crontab 脚本 | 脚本 fork 后未等待 |
| shell 脚本 | 后台 & 未 wait |
| Java / Python 服务 | 调用外部命令未回收 |
| docker / exec | 容器 init 不健全 |
僵尸进程不能直接 kill,只能让其父进程退出或由 systemd 回收。
如果你愿意,可以贴出:
ps -ef | grep defunct 输出我可以帮你具体分析该怎么处理。