在 CentOS(以及大多数 Linux 系统)中,**僵尸进程(Zombie / Z 状态)**是已经结束但还没有被父进程回收的进程。它们不占用 CPU 或内存,但会占用 PID,数量多了可能有问题。
下面是查看和处理僵尸进程的方法。
ps 查看(最常用)ps -eo pid,ppid,state,cmd | grep ' Z'
说明:
Z 表示僵尸状态pid:僵尸进程 PIDppid:父进程 PIDcmd:进程命令示例输出:
1001 800 Z [test] <defunct>
ps -eo state | grep Z | wc -l
toptop
在任务信息中查看:
Tasks: 120 total, 1 running, 119 sleeping, 0 stopped, 1 zombie
如果有 zombie > 0 说明存在僵尸进程。
僵尸进程不能直接 kill,需要让父进程回收它。
ps -o pid,ppid,state,cmd -p <僵尸PID>
或者一次性查看所有僵尸及其父进程:
ps -eo pid,ppid,state,cmd | awk '$3=="Z"'
如果父进程是某个服务(如 Java、Python、Nginx worker):
systemctl restart 服务名
或:
kill -HUP 父进程PID
SIGHUP可能触发父进程重新加载并回收子进程(取决于程序实现)
⚠️ 不推荐直接 kill 父进程,除非确认安全。
kill -9 父进程PID
父进程死后,僵尸进程会被 init(PID 1)接管并自动回收。
kill -9 僵尸PID
✅ 僵尸进程无法被 kill,因为它已经死了。
#!/bin/bash
ZOMBIES=$(ps -eo state | grep Z | wc -l)
if [ "$ZOMBIES" -gt 0 ]; then
echo "发现 $ZOMBIES 个僵尸进程"
ps -eo pid,ppid,state,cmd | awk '$3=="Z"'
else
echo "没有僵尸进程"
fi
wait() / waitpid()multiprocessing)| 操作 | 命令 |
|---|---|
| 查看僵尸进程 | ps -eo pid,ppid,state,cmd | grep Z |
| 统计数量 | ps -eo state | grep Z | wc -l |
| 查看父进程 | ps -o ppid= -p 僵尸PID |
| 处理方式 | 重启父进程 / 修复程序 |
| 能否 kill | ❌ 不能 |
如果你愿意,可以把 ps -ef 或 top 的输出贴出来,我可以帮你具体判断是哪个程序在产生僵尸进程。