准确统计nginx文件描述符需区分master与worker进程:用pgrep -f "nginx: (master|worker) process"获取全部pid,对worker用ls -l /proc/pid/fd/ | wc -l精确计数,汇总时用lsof -p pid1,pid2,... | tail -n +2 | wc -l并忽略权限错误。

直接用 lsof 查 Nginx 进程打开的文件描述符数量,关键在准确识别进程、排除干扰项、统计真实占用。不是简单跑一条命令就完事,得区分 master 和 worker,还要注意输出格式和权限问题。
先确认 Nginx 的 PID 列表
只查一个 PID 容易漏掉 worker 进程,必须把 master 和所有 worker 都纳入范围:
- 用
pgrep -f "nginx: (master|worker) process"一次性匹配两类进程 - 避免用
ps aux | grep nginx,因为可能混入 grep 自身或旧残留进程 - 如果配置了 pid 文件(如
/var/run/nginx.pid),可用cat /var/run/nginx.pid获取 master PID,再用pgrep -P $MASTER_PID找 worker
统计单个 worker 进程的真实 fd 数
worker 是实际处理请求的主体,监控它最反映负载压力:
- 执行
ls -l /proc/$(pgrep -f "nginx: worker" | head -n1)/fd/ 2>/dev/null | wc -l——这是最准的方式,直接数/proc/PID/fd/下的符号链接数 - 等效但稍慢的方法:
lsof -p $(pgrep -f "nginx: worker" | head -n1) | tail -n +2 | wc -l,tail -n +2是为了跳过表头行 - 别用
lsof -p PID | wc -l直接计数,会多算一行表头,结果偏高
汇总全部 Nginx 进程的总句柄数
要评估整体资源消耗,需合并 master + 所有 worker:
- 命令:
lsof -p $(pgrep -f "nginx: (master|worker) process" | tr '\n' ',' | sed 's/,$//') 2>/dev/null | tail -n +2 | wc -l -
tr和sed把换行 PID 转成逗号分隔格式,适配lsof -p多 PID 语法 -
2>/dev/null忽略因权限不足(如非 root 查 root master)导致的报错,防止中断统计 - 注意:master 进程本身打开的 fd 很少(通常
结合 limits 判断是否逼近瓶颈
光看数字没意义,必须对照限制值才能判断风险:
- 查当前 worker 的软限制:
cat /proc/$(pgrep -f "nginx: worker" | head -n1)/limits | grep "Max open files",重点关注 Soft Limit 值 - 计算使用率:若
ls /proc/PID/fd/ | wc -l超过 Soft Limit 的 85%,就该预警 - 查系统级总量:
cat /proc/sys/fs/file-nr看第二列(已用)是否接近第三列(最大),避免全局耗尽影响其他服务











