在 Debian(以及所有 Linux 系统)中,僵尸进程(Zombie / defunct)本质上是已经结束运行、但父进程还没调用 wait() 回收其退出状态的进程。它不占 CPU、不占内存,只保留一个进程表项(PID + 退出码)。
处理僵尸进程,核心思路是:让父进程回收它,或干掉父进程。
ps -l
或
ps -ef | grep defunct
看到 STAT 为 Z 就是僵尸:
UID PID PPID STAT
root 1234 567 Z
僵尸进程本身不能直接 kill,只能处理它的父进程。
ps -o ppid= -p 僵尸PID
kill -SIGCHLD 父PID
如果父进程写得好,会回收子进程。
如果是服务类进程(如 nginx、php-fpm、docker、systemd 子进程):
systemctl restart 服务名
例如:
systemctl restart php-fpm
父进程退出后,僵尸会被 init(PID 1)接管并回收。
⚠️ 注意:可能影响业务
kill -9 父PID
父进程死后:
init / systemd 接管wait() 回收init / systemd(PPID=1)正常不该出现,若出现:
可尝试:
systemctl daemon-reexec
极端情况只能重启机器。
通常是:
fork 但不 wait解决:
wait() / 使用 signal(SIGCHLD))❌ kill -9 僵尸PID
→ 无效,僵尸已死,只是没回收
❌ 写脚本无限 kill 僵尸
→ 没用,治标不治本
wait() / waitpid()SIGCHLD 信号处理system() / popen() 代替裸 forksystemd 管理服务Restart=on-failureps -e -o stat | grep -c Z
僵尸进程不用“杀”,要让父进程“收”;父进程不收,就重启或杀父。
如果你愿意,可以把 ps -ef 或 top 的输出贴出来,我可以帮你具体分析是哪个服务导致的。