在 CentOS(以及大多数 Linux 发行版)中,僵尸进程(Zombie Process)本身不能被直接“杀死”,因为它们已经结束运行,只是还在进程表中保留一条记录,等待父进程读取其退出状态。
下面按原理 → 常见原因 → 处理方法 → 预防措施来说明。
Z(Zombie)wait() / waitpid()ps -eo pid,ppid,stat,cmd | grep Z
输出示例:
12345 1000 Z [test] <defunct>
常见原因:
wait() / waitpid()SIGCHLD僵尸进程只能由父进程回收。
ps -eo pid,ppid,stat,cmd | grep Z
示例:
PID PPID STAT CMD
12345 1000 Z [test] <defunct>
说明:
ps -p 1000 -o pid,ppid,stat,cmd
kill 1000 # 优雅终止
kill -9 1000 # 强制
✅ 父进程结束后,僵尸进程会被 init(PID 1)接管并清理
如果是服务产生的:
systemctl restart httpd
systemctl restart php-fpm
systemctl restart docker
CentOS 7+:
ps -p 1 -o comm=
应为:
systemd
如果 PID 1 异常,才可能收不到僵尸进程。
kill -9 <僵尸PID> # ❌ 无效
原因:
wait(NULL);
// 或
signal(SIGCHLD, SIG_IGN);
import signal
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
或:
os.waitpid(-1, os.WNOHANG)
✅ 少量僵尸进程
❌ 大量持续增加
查看当前 PID 使用:
cat /proc/sys/kernel/pid_max
| 场景 | 处理方式 |
|---|---|
| 少量僵尸 | 可忽略 |
| 同一父进程 | kill 父进程 |
| 服务产生 | restart 服务 |
| 程序 bug | 修改代码 |
| 想直接 kill 僵尸 | ❌ 行不通 |
如果你愿意,可以:
ps -ef / top 输出贴出来我可以帮你精确定位是哪一个程序的问题。