在 Debian(以及大多数 Linux 发行版)中,僵尸进程(zombie process)本身不会占用 CPU 或内存,但会占用进程表项。如果数量很多,可能导致无法创建新进程。下面从原理、排查、处理、预防几个方面说明。
wait() 回收其状态 的进程Z(Zombie)kill 掉(因为它已经死了)示例:
ps aux | grep Z
输出中常见:
user 12345 0.0 0.0 0 0 ? Z 10:00 0:00 [process] <defunct>
psps -eo pid,ppid,stat,cmd | grep ' Z'
STAT=Z 表示僵尸PPID 是父进程 IDps aux | awk '$8=="Z" { print $2 }' | wc -l
僵尸进程 只能由父进程回收,所以:
ps -o pid,ppid,stat,cmd -p <僵尸PID>
systemctl restart 服务名
init(PID 1):kill -9 僵尸PID
✅ 没用,因为进程已经死了。
原因
fork() 后未 wait() / waitpid()SIGCHLD修复方式(C 示例)
signal(SIGCHLD, SIG_IGN); // 让系统自动回收
或:
while (waitpid(-1, NULL, WNOHANG) > 0);
错误示例
(sleep 10) &
✅ 推荐:
(sleep 10 &)
wait
或显式回收子进程。
常见于:
✅ 解决:
systemctl restart 服务
kill -9 父进程PID
之后僵尸会被 PID 1 回收。
⚠️ 可能影响业务,需谨慎。
✅ 编程层面
SIGCHLDwait() / waitpid()✅ 运维层面
supervisor / systemd 管理进程#!/bin/bash
Z=$(ps aux | awk '$8=="Z"' | wc -l)
if [ "$Z" -gt 5 ]; then
echo "Warning: $Z zombie processes"
fi
僵尸进程杀不掉,只能让父进程回收;处理父进程才是正解。
如果你愿意,可以把:
ps -eo pid,ppid,stat,cmd 输出贴出来,我可以帮你精确定位并给出处理方案。