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 没有输出?
-
权限不足:普通用户无法查看属于
root或其他用户的进程文件信息。请尝试在命令前加sudo。 -
文件未被打开:该文件当前确实没有被任何活跃进程占用。
既然你在研究高性能日志查看器和系统底层调用(如 pread),你是否遇到过因为文件描述符(FD)泄漏导致 lsof 结果异常的情况?