lsof 是 Linux 下用于列出进程打开文件及各类类文件资源的诊断工具,支持按 PID、路径、端口、用户等条件筛选,并可识别句柄泄漏、文件占用、端口冲突等问题。

lsof(list open files)是 Linux 中一个功能强大的系统诊断工具,不仅能列出进程打开的文件,还能显示网络连接、设备、管道、套接字等各类“类文件”资源。在排查句柄泄漏、文件被占用、端口冲突等问题时非常实用。
查看指定进程打开的所有文件句柄
通过 -p 选项指定进程 PID,可精准查看该进程当前打开的全部文件句柄:
- lsof -p 1234 —— 显示 PID 为 1234 的进程打开的所有文件和资源
- 输出字段包括:COMMAND(进程名)、PID、USER(属主)、FD(文件描述符)、TYPE(类型)、DEVICE、SIZE/OFF(大小或偏移)、NODE(inode)、NAME(路径或地址)
- 特别注意 FD 列:如 0u(标准输入)、1w(标准输出)、cwd(当前工作目录)、mem(内存映射)、IPv4/IPv6(网络连接)
按文件路径或名称查找使用该资源的进程
当某个文件被占用无法删除,或想确认哪个进程正在读写某日志、配置或设备时,可用 -a(AND)配合 -p 和 -d 等选项精确定位:
- lsof /var/log/nginx/access.log —— 查看哪些进程打开了该日志文件
- lsof -i :8080 —— 查看监听或连接 8080 端口的所有进程(含 TCP/UDP)
- lsof -u username —— 查看指定用户所有打开的文件
- lsof +D /tmp —— 递归列出 /tmp 下所有被打开的文件(注意性能开销)
识别异常句柄与常见问题线索
正常运行的进程会打开少量常规句柄(如 0/1/2、/proc、/dev/pts、共享库等),但以下情况值得警惕:
- FD 列出现大量数字型描述符(如 15, 27, 1024…)且 NAME 指向同一日志或临时文件 → 可能存在未关闭的文件描述符,导致句柄泄漏
- TYPE=REG 但 SIZE/OFF 增长迅速,NAME 为滚动日志 → 进程可能未响应 logrotate 的 HUP 信号,仍在写旧文件
- FD=DEL 或 NAME 显示 “(deleted)” → 文件已被 unlink,但进程仍持有句柄,磁盘空间不会释放
- TYPE=sock 且 STATE=LISTEN 但无对应服务进程 → 可能残留僵尸监听或权限异常
实用技巧与注意事项
提升排查效率的同时避免误操作:
- 加 -n 禁用主机名解析,加快输出(lsof -n -i :22)
- 加 -t 仅输出 PID,适合脚本调用(lsof -t -i :3306)
- 普通用户只能查看自己进程;查看系统级资源需 sudo 权限
- 某些内核模块或容器环境(如 rootless Podman)中,lsof 可能无法显示全部信息,可配合 /proc/PID/fd/ 手动检查










