您的位置:首页 >Linux怎么查看具体的描述符占用
发布于2026-08-12 阅读(0)
扫一扫,手机访问
更稳妥的做法,其实是直接去读 /proc/[pid]/fd/ 这个目录:先用 ls -l 把所有数字形式的 fd 项列出来,再通过 readlink 看它们各自指向哪里;接着把 stdin/stdout/stderr 这类伪路径过滤掉,同时结合 stat 或 readlink 失败的结果判断该 fd 是否已经关闭,这样就能尽量不依赖 lsof 之类的外部工具。

直接读 /proc/[pid]/fd/ 是最轻量、最可靠的方式,不需要额外工具,也不受权限限制(只要能访问该进程的 proc 目录)。每个数字子项就是一个打开的 fd,readlink 能看出它指向什么。
pgrep nginx 或 pidof mysqldls -l /proc/1234/fd/,输出类似:0 -> /dev/pts/03 -> socket:[123456]4 -> /var/log/nginx/access.logls -l /proc/1234/fd/ | awk '$NF !~ /^/dev/pts/|^/proc/|^/sys// {print}'readlink: No such file or directory)通常意味着 fd 已关闭但未被回收,属于内核延迟释放,不是泄漏lsof 看起来全面,但实际容易出问题:权限不足时跳过部分条目;遇到已关闭但未清理的 fd 会显示 can't identify protocol 或直接漏掉;某些容器环境或 seccomp 限制下根本跑不起来。
lsof: no pwd entry for UID xxx —— 不影响计数,但说明用户数据库缺失,lsof -n -p PID 可绕过 DNS/UID 解析lsof -p PID | wc -l,它包含表头和空行;稳妥写法:lsof -n -p PID 2>/dev/null | grep -v "COMMAND" | wc -llsof -n -p PID | awk '{print $9}' | sort | uniq -c | sort -nr | head -5,看哪些路径重复最多这两个字段是内核快照值,非实时精确计数,但适合快速巡检。它们来自同一内存结构,比遍历 /proc/[pid]/fd/ 开销小得多。
cat /proc/1234/status | grep -E 'FDs|FDSize',输出形如:FDSize: 256FDs: 42FDs 是当前已分配且活跃的 fd 数(≈ ls /proc/[pid]/fd/ | wc -w)FDSize 是内核为该进程预分配的 fd 槽位总数(通常是 256、1024、2048 等 2 的幂),不是限制值,只是内部哈希表大小FDs 接近 FDSize,说明进程频繁扩容 fd 表,可能有泄漏或设计缺陷光看 /proc/[pid]/fd/ 里有链接不够,得验证它是否还绑定有效资源。很多“僵尸 fd”其实是 close() 调用后未被内核立即回收的残留。
readlink /proc/1234/fd/3,若返回 No such file or directory,大概率已关闭stat /proc/1234/fd/3 2>/dev/null | grep -q "No such file" 判断是否存在readlink 成功但目标路径是 socket:[123456] 或 anon_inode:[eventpoll],说明是网络连接或 epoll 实例,属正常活跃状态pipe:[...] 或 inotify 却长期不读写的 fd,这类容易堆积
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9