lsof 通过读取 /proc/pid/fd/ 内核快照精准定位被占用的文件描述符与目录句柄:可查指定文件或目录占用进程、进程所有打开项、用户或进程名范围内的句柄,并支持手动验证 /proc 下真实链接。

Linux 运维中,查找被占用的文件描述符与目录句柄,核心就是用 lsof 精准定位“谁在持有哪些资源”。它不依赖进程主动上报,而是直接读取 /proc/PID/fd/ 的内核快照,因此结果真实可靠。
查指定文件或目录被哪些进程占用
这是最直接的入口。只要路径存在(哪怕已被删除),lsof 就能反向追溯到持有它的进程:
-
查单个文件:执行
lsof /var/log/app.log,输出中 PID 列即为占用进程号,FD 列显示描述符编号(如 3w),NAME 列确认路径匹配 -
查整个目录(含子目录):用
lsof +D /tmp。注意:+D是递归扫描,对大目录(如/home)会明显变慢,生产环境慎用;若只需本级目录,改用lsof +d /tmp -
查目录被占用却无法卸载时:常见于
umount: /mnt: device is busy。直接运行lsof +D /mnt,通常能快速发现是某个 shell 的 cwd、某个 tail 进程或编辑器实例在内部停留
查进程打开的所有文件描述符
当你已知可疑进程 PID(比如通过 ps aux | grep nginx 获取),可一次性看清它持有哪些资源:
-
列出全部打开项:运行
sudo lsof -p 1234(替换为实际 PID)。重点关注 NAME 列——它可能是普通文件、/dev/zero、socket:[123456]或/path/to/dir (deleted) -
快速过滤常规文件:加上
| grep REG,排除 socket、pipe 等类型,聚焦磁盘上的真实文件操作 -
识别已删除但仍占空间的文件:NAME 列末尾带
(deleted)字样,FD 列常为1w或3u,SIZE/OFF 列可能显示较大字节数——这正是磁盘“空间消失”的元凶
查用户或进程名范围内的句柄使用
当问题范围较广(如怀疑某类服务整体句柄泄漏),可用筛选缩小战场:
-
按用户名汇总:执行
lsof -u www-data,查看该用户下所有进程打开的文件总览;加| wc -l可粗略统计句柄数量,异常偏高即需深入 -
按进程名匹配:用
lsof -c java查所有 java 开头的命令(如 java、javaw),适合排查 JVM 应用日志、临时文件堆积 -
组合条件更精准:例如
lsof -u nginx -iTCP只看 nginx 用户下的 TCP 连接,避免干扰;或lsof -p 1234 -d 0,1,2专门检查标准输入/输出/错误是否异常重定向
手动验证与底层对照
当 lsof 因权限限制未返回完整结果,或你想确认输出是否可信,可绕过工具直查内核视图:
- 进入
/proc/1234/fd/目录,执行ls -l。每个数字链接(如3 -> /var/log/access.log)就是该进程一个打开的文件描述符,内容与 lsof 输出一一对应 - 若看到类似
3 -> /var/log/error.log (deleted),说明文件已被 rm 删除但句柄未关闭,此时 lsof 输出中的DEL或(deleted)即源于此 - 对比
lsof -p 1234与ls -l /proc/1234/fd/的条目数,若严重不一致,大概率是权限不足(非 root 用户看不到其他用户的 fd)











