Linux系统文件与进程监控工具 lsof 使用详解
lsof 命令概述
lsof(List Open Files)是 Linux 系统中一个强大的命令行工具,用于列出当前被进程打开的文件。在 Linux 中,"一切皆文件",因此该命令不仅可以查看普通文件的使用情况,还能显示目录、网络连接、设备、套接字等资源的占用状态。
常用语法格式
lsof [选项] [文件]
核心选项说明
- -c <进程名>:显示指定进程名称所打开的所有文件。
- +D <目录路径>:递归扫描并列出目录下所有被打开的文件。
- -i [<条件>]:根据网络协议、端口或 IP 列出相关的网络连接进程。支持 IPv4、IPv6、TCP、UDP 等。
- -n <路径>:列出使用 NFS 文件系统的文件信息(注意:此处 -n 实际常用于禁用主机名解析)。
- -p <PID>:仅显示指定进程 ID 所打开的文件。
- -u <用户名|UID>:列出特定用户或 UID 关联的所有打开文件。
输出字段解析
| 列名 | 含义 |
|---|---|
| COMMAND | 进程对应的程序名称 |
| PID | 进程标识符 |
| TID | 线程 ID(若存在) |
| USER | 进程所属用户 |
| FD | 文件描述符类型 |
| TYPE | 文件类型(如 REG、DIR、IPv4 等) |
| DEVICE | 设备编号 |
| SIZE/OFF | 文件大小或偏移量 |
| NODE | inode 编号 |
| NAME | 文件、目录或网络地址名称 |
文件描述符(FD)常见值
- cwd:当前工作目录
- rtd:根目录
- txt:程序代码或共享库
- 0, 1, 2:分别代表标准输入、输出和错误
文件类型(TYPE)常见值
- REG:普通文件
- DIR:目录
- CHR:字符设备
- BLK:块设备
- UNIX:Unix 域套接字
- FIFO:命名管道
- IPv4/IPv6:网络套接字
典型应用场景与示例
1. 查看系统中所有已打开的文件
lsof | more
此命令会输出系统中所有正在使用的文件列表,通常输出较多,建议结合分页工具如 more 或 less 使用。
2. 查找访问特定文件的进程
lsof /usr/bin/bash
输出结果将显示所有正在使用 bash 可执行文件的进程,便于排查文件占用问题。
3. 递归检查某目录下的打开文件
lsof +D ~/.local/share/
该命令会深入遍历指定目录,列出所有被进程打开的子文件和子目录。
4. 通过 grep 模拟文件查找功能
lsof | grep "/home/xf/.local/share"
当不使用 +D 时,可通过管道配合 grep 实现对路径的模糊匹配,适用于复杂筛选场景。
5. 显示指定用户的文件活动
lsof -u xf
列出用户 xf 当前打开的所有文件及相关进程,帮助进行权限或资源审计。
6. 根据进程名或 PID 查看其文件使用情况
方法一:按进程名过滤
lsof -c sleep
方法二:结合 ps 与 lsof 按 PID 查询
ps aux | grep sleep
lsof -p 16071
先通过 ps 获取目标进程 PID,再用 lsof 查看其详细文件句柄信息。
7. 监控网络连接状态
列出所有网络连接:
lsof -i
仅显示 IPv4 连接:
lsof -i 4
查看特定端口的使用情况(如 SSH):
lsof -i :22
查看 TCP 协议的监听连接:
lsof -i tcp -s TCP:LISTEN
8. 检查 NFS 文件系统使用情况
lsof -n /home/xf
虽然 -n 主要作用是禁止 DNS 解析以加快输出速度,但结合路径参数可有效识别挂载点上的文件访问行为,尤其适合分析 NFS 共享目录。