一、什么是僵尸进程
僵尸进程(Zombie Process)是已终止运行但未被父进程回收资源的进程,其状态在进程表中标记为Z(Zombie)。它不会占用CPU或内存,但会消耗进程ID(PID)资源,大量僵尸进程可能导致系统无法创建新进程。
二、排查僵尸进程的常用方法
ps命令(最基础)ps命令可筛选出状态为Z的进程,结合grep过滤关键信息:
ps aux | grep 'Z' # 列出所有僵尸进程,重点关注STAT列(Z表示僵尸)
ps -A -ostat,ppid,pid,cmd | grep -e '[Zz]' # 直接显示状态、父进程ID(PPID)、进程ID(PID)和命令
ps aux --forest | grep 'Z' # 以树状结构展示进程关系,更直观识别僵尸进程的父子层级
输出示例:
user 1234 0.0 0.0 0 0 ? Z 10:00 0:00 [myapp] <defunct> # <defunct>表示僵尸进程
关键信息:记录僵尸进程的PID(进程ID)和PPID(父进程ID),后续分析需用到。
top/htop命令(动态监控)top命令:
运行top后,按f键进入字段管理,勾选STAT列;或在命令中直接指定显示状态:
top -c # 显示完整命令,便于识别僵尸进程
在进程列表中,**STAT列为Z**的即为僵尸进程。
htop命令(需安装,更友好):
sudo apt update && sudo apt install htop # 安装htop
htop # 运行后按F3搜索“zombie”或查看`S`(状态)列,`Z`表示僵尸进程
pstree命令(树状结构展示)pstree以树状结构显示进程关系,僵尸进程会在PID后标记[Z]:
pstree -p | grep -i defunct # 查找所有标记为defunct的进程
输出示例:
myapp(1234)─┬─{child1}(5678) # 若child1状态为Z,会显示为child1(5678)[Z]
/proc文件系统(底层验证)/proc目录存储了所有进程的实时信息,可通过脚本扫描status文件中的State字段:
for pid in /proc/[0-9]*; do
if [ "$(cat $pid/status | grep State | grep zombie)" ]; then
echo "PID: $(basename $pid), Name: $(cat $pid/cmdline | tr '\0' ' ')"
fi;
done
说明:该命令会列出所有僵尸进程的PID和命令名称,适合批量排查。
三、排查后的关键动作——获取父进程信息
找到僵尸进程后,必须定位其父进程(PPID),因为僵尸进程的回收依赖父进程调用wait()或waitpid()函数。通过ps命令获取父进程信息:
ps -p <僵尸进程PID> -o ppid= # 示例:ps -p 1234 -o ppid= # 输出父进程ID
ps -p <父进程PID> -o pid,ppid,cmd # 进一步查看父进程的详细信息(如命令名称)
四、后续处理建议(简要)
排查到僵尸进程后,需根据父进程情况采取对应措施(如终止异常父进程、重启服务等),具体方法可参考系统日志或程序文档。若僵尸进程频繁出现,需检查父进程代码是否存在未正确回收子进程的bug(如未调用wait())。