在 Ubuntu(以及一般 Linux 系统)里,僵尸进程(Zombie / defunct)本质上是因为子进程结束后,父进程没有调用 wait() / waitpid() 回收其退出状态导致的。
僵尸进程本身不占 CPU、内存,但会占用 PID,过多会影响系统。
下面从原理 → 排查 → 预防 → 应急处理系统说明。
wait() 才能彻底释放Z(zombie)查看方式:
ps -ef | grep defunct
# 或
ps aux | awk '$8 ~ /Z/'
signal(SIGCHLD, SIG_IGN); // 忽略子进程退出信号(系统自动回收)
或:
while (waitpid(-1, NULL, WNOHANG) > 0);
import signal
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
或:
os.waitpid(-1, os.WNOHANG)
wait
systemd 管理进程(推荐)Ubuntu 默认使用 systemd:
示例 unit:
[Service]
Type=simple
ExecStart=/opt/myapp
Restart=on-failure
常见问题:
& 后台执行但父脚本一直运行✅ 建议:
nohup xxx & 长期跑ps -ef | grep defunct
看 PPID
kill -TERM 父PID
# 不行再
kill -9 父PID
⚠️ 僵尸进程不能直接 kill
只能由其父进程退出后被 init(PID 1)回收
一般不会,除非:
解决:
tini)ENTRYPOINT ["/usr/bin/tini", "--", "your_app"]
可能是:
建议:
ulimit✅ 最佳实践
SIGCHLD❌ 错误做法
kill -9 zombie如果你愿意,可以:
ps -ef 输出我可以帮你具体分析僵尸来源并给出针对性方案。