命令详解 lsof

lsof 是 “list open files” 的缩写。Linux 中套接字、设备、目录和普通文件都可表现为文件描述符,因此它常用于定位端口占用、无法卸载的文件系统、被删除但仍占空间的文件,以及进程正在访问的路径。

基础用法

# 查看某个文件被谁打开
sudo lsof -- /var/log/app.log

# 查看目录树中打开的文件(可能较慢)
sudo lsof +D /srv/app

# 查看某个 PID
sudo lsof -p 1234

# 查看某个用户的进程
sudo lsof -u appuser

普通用户通常只能看到自己有权限访问的信息。系统级排障建议使用 sudo,并明确过滤条件,避免在大型服务器上直接扫描全部文件。

端口和网络连接

# 8080 端口,不解析主机名和服务名
sudo lsof -nP -i :8080

# TCP 监听套接字
sudo lsof -nP -iTCP -sTCP:LISTEN

# UDP 53 端口
sudo lsof -nP -iUDP:53

# IPv4 TCP 443
sudo lsof -nP -i4TCP:443

-n 禁止 DNS 反查,-P 禁止把端口转换为服务名,排障时速度更快、结果也更直观。

多个条件如何组合

lsof 中不同选择条件常按“或”匹配;增加 -a 才表示所有条件同时满足。例如只查看 PID 1234 的 TCP 连接:

sudo lsof -nP -a -p 1234 -iTCP

排除用户使用 ^:

sudo lsof -u ^root

不要凭印象组合参数,复杂过滤应先在测试环境确认结果。-F 用于生成便于程序解析的字段输出,不是普通的文件筛选选项。

找回“文件删了但空间没释放”的原因

sudo lsof +L1

输出中链接数小于 1 的打开文件通常已从目录删除,但仍被进程持有。安全处理方式是让对应服务正常重新打开日志或重启服务,而不是随意写入 /proc/<pid>/fd/*。处理后用 df -h 验证空间是否释放。

无法卸载文件系统

sudo lsof /mnt/data
sudo fuser -vm /mnt/data

先判断是进程工作目录、打开文件、容器挂载还是网络文件系统卡顿。不要仅为卸载而强制终止未知业务进程。

读懂关键列

列 含义
COMMAND 进程命令名,可能被截断
PID / USER 进程号 / 所属用户
FD 文件描述符及访问模式,如 cwd、txt、3r、4w
TYPE REG、DIR、IPv4、IPv6 等
DEVICE / NODE 设备号 / inode 或协议相关标识
NAME 路径、地址或连接信息

性能与边界

  • +D 会递归扫描目录,大目录上成本高;先缩小范围。
  • NFS 或异常网络挂载可能让查询变慢,应结合 findmnt、mount 和系统日志。
  • 容器内外的 PID、挂载命名空间不同,需要在正确命名空间执行。
  • 不同系统和版本支持的选项可能不同,以 lsof -h 和本机手册为准。

官方参考

Copyright © yan-jian.com 2023 - 2026 · Powered by GitBook更新时间: 2026-10-17 14:18:58

results matching ""

    No results matching ""