lsof (List Open Files) 是 Linux/Unix 系统中极其强大的调试工具。在 Linux 中,“一切皆文件”,所以 lsof 不仅能查看普通文件,还能查看目录、网络套接字(Sockets)、管道、设备文件等。

以下是针对“查看文件被谁打开”这一核心需求的常用命令及进阶技巧:

1. 基础用法:查看特定文件被哪个进程占用

这是最直接的用法,输出将包含进程名(COMMAND)、进程 ID(PID)、用户(USER)以及文件描述符(FD)等。


2. 常用场景快捷指令


3. 高级组合技巧

  • 组合过滤(“且”逻辑)

    如果你想看用户 root 且正在访问 /var/log 的进程,直接连用即可:

    注意-a 参数非常重要,它表示条件的“与(AND)”关系,默认是“或(OR)”。

  • 查找已删除但仍占用空间的文件

    这是运维中最常用的技巧。当你发现磁盘满了但找不到大文件时,可能是文件被删除了但进程还没退出:

  • 查看某个程序的网络连接


4. 输出字段含义速查

当你执行 lsof 后,会看到以下表头:

  • COMMAND: 进程名称。

  • PID: 进程标识符。

  • USER: 进程所有者。

  • FD (File Descriptor): 文件描述符(如 cwd 代表当前目录,txt 代表可执行文件,0u 代表标准输入且读写模式)。

  • TYPE: 文件类型(如 REG 普通文件,DIR 目录,IPv4 网络)。

  • NODE: 索引节点(文件在磁盘上的唯一标识)。

  • NAME: 文件的确切路径或网络链接地址。

5. 常见问题:为什么 lsof 没有输出?

  1. 权限不足:普通用户无法查看属于 root 或其他用户的进程文件信息。请尝试在命令前加 sudo

  2. 文件未被打开:该文件当前确实没有被任何活跃进程占用。

既然你在研究高性能日志查看器和系统底层调用(如 pread),你是否遇到过因为文件描述符(FD)泄漏导致 lsof 结果异常的情况?