简要结论:僵尸进程(zombie)本身不一定是 bug,但“大量/长期存在的僵尸进程”通常是 bug 或配置问题的表现。
下面分开说清楚。
在 Linux / CentOS 中:
wait() / waitpid() 回收它Z(zombie)僵尸进程:
init/systemd 接管回收不算 bug 的情况:
这是 UNIX 进程模型的正常机制
以下通常算 程序 bug 或系统问题:
说明:
wait)可能原因:
SIGCHLD例如:
javahttpdnginx worker这往往说明:
| 场景 | 是否 bug |
|---|---|
| systemd 产生少量僵尸 | 正常 |
| 自己写的脚本 fork 后不 wait | bug |
| Java 程序产生大量 Z | 通常是 bug |
| cron 任务产生僵尸 | 可能是脚本问题 |
| 父进程是 1(init)还有僵尸 | 异常(少见) |
ps -ef | grep defunct
或
ps -eo pid,ppid,stat,cmd | awk '$3=="Z"'
关键看:
如果你愿意,可以贴一下:
ps -ef | grep defunct
或父进程信息,我可以帮你判断具体是不是 bug、出在哪。