更稳妥的做法,其实是直接去读 /proc/[pid]/fd/ 这个目录:先用 ls -l 把所有数字形式的 fd 项列出来,再通过 readlink 看它们各自指向哪里;接着把 stdin/stdout/stderr 这类伪路径过滤掉,同时结合 statreadlink 失败的结果判断该 fd 是否已经关闭,这样就能尽量不依赖 lsof 之类的外部工具。

Linux怎么查看具体的描述符占用

怎么查某个进程当前打开的 fd 列表

直接读 /proc/[pid]/fd/ 是最轻量、最可靠的方式,不需要额外工具,也不受权限限制(只要能访问该进程的 proc 目录)。每个数字子项就是一个打开的 fd,readlink 能看出它指向什么。

为什么 lsof -p PID 有时不准或报错

lsof 看起来全面,但实际容易出问题:权限不足时跳过部分条目;遇到已关闭但未清理的 fd 会显示 can't identify protocol 或直接漏掉;某些容器环境或 seccomp 限制下根本跑不起来。

cat /proc/[pid]/status 里的 FDs 和 FDSize 是啥

这两个字段是内核快照值,非实时精确计数,但适合快速巡检。它们来自同一内存结构,比遍历 /proc/[pid]/fd/ 开销小得多。

怎么确认某个 fd 是否真在用

光看 /proc/[pid]/fd/ 里有链接不够,得验证它是否还绑定有效资源。很多“僵尸 fd”其实是 close() 调用后未被内核立即回收的残留。

真正麻烦的不是“怎么列出来”,而是区分哪些是业务必需、哪些是泄漏残留——得结合应用逻辑看 fd 类型和生命周期,不能只盯数字。
本文转载于:https://www.php.cn/faq/2978186.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。