可以使用如下命令查看当前进程打开的文件描述符信息
# 查看指定进程打开的文件描述符
lsof -p <pid># 统计打开的文件描述符数量
lsof -p <pid> | wc -l
其结果各字段含义如下
- COMMAND:进程的名称(命令名)
- 显示的是启动该进程的命令的前 9 个字符
- PID:Process ID
- 进程的标识号
- USER:进程所有者的用户名
- 显示进程所属的用户
- FD(File Descriptor)常见的文件描述符类型:
- cwd: 当前工作目录
- rtd: 根目录
- txt: 程序文本(代码和数据)
- mem: 内存映射文件
- 0u: 标准输入(stdin)
- 1u: 标准输出(stdout)
- 2u: 标准错误(stderr)
- [数字]r: 表示该文件被打开为只读模式
- [数字]w: 表示该文件被打开为只写模式
- [数字]u: 表示该文件被打开为读写模式
- TYPE:文件类型,常见的类型包括:
- REG: 普通文件
- DIR: 目录
- CHR: 字符特殊文件
- BLK: 块特殊文件
- UNIX: UNIX 域套接字
- FIFO: 先进先出队列
- IPv4: IPv4 套接字
- IPv6: IPv6 套接字
- DEVICE:以主设备号和次设备号显示的设备编号
- 格式通常为 “主设备号,次设备号”
- SIZE/OFF:文件的大小或文件偏移量(以字节为单位)
- 如果是字符特殊文件,则为空
- NODE:文件的索引节点号(inode number)
- 标识文件系统中的具体文件
- NAME:文件的实际名称
- 对于 Socket,显示为协议:地址
- 对于管道和网络 Socket,显示为相关的地址
例1:so 文件的 python 内存映射
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
special-c 48 appops mem REG 8,17 19287503 /usr/local/python-3.10.12/lib/python3.10/lib-dynload/_lzma.cpython-310-x86_64-linux-gnu.so (path dev=0,437)
- special-c:这是一个被截断的进程名(只显示前9个字符)可能完整名称是 special-command 或类似的名称
- 48:这个进程的系统标识号是 48
- appops:这个进程是由 appops 用户运行的
- mem:mem 表示这是一个内存映射文件,通常用于加载动态链接库(.so 文件)
- REG:表示这是一个普通文件(regular file)
- 8,17:8 是主设备号,17 是次设备号,这通常表示某个磁盘分区
- 空白的 SIZE/OFF:对于内存映射文件,这个值通常为空
- 19287503:文件的 inode 号,用于在文件系统中唯一标识这个文件
- /usr/local/python-3.10.12/lib/python3.10/lib-dynload/_lzma.cpython-310-x86_64-linux-gnu.so (path dev=0,437):这是一个 Python 的动态链接库,具体是 lzma 压缩模块的实现。括号中的 path dev=0,437 表示文件系统设备号
综合解读:一个名为 special-c 的进程(PID 48),由 appops 用户运行,将 Python 的 lzma 压缩模块的动态链接库映射到了内存中。
这是 Python 3.10.12 的一个组件,这种内存映射通常发生在程序加载动态库时。
例 2:redis 链接
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
special-c 48 appops 4u IPv4 2473315863 0t0 TCP online-94bcd5699-lg8ql:33946->110.120.10.234:6379 (ESTABLISHED)
- 4u:
- 文件描述符号为 4
- u 表示读写模式(read-write)
- IPv4: 使用 IPv4 协议
- 2473315863: 系统内部的套接字标识号
- 0t0: 文件偏移量(对于套接字来说通常为 0)
- TCP:连接协议
- 详细连接信息
- 本地端: online-94bcd5699-lg8ql:33946:主机名看起来是一个 Kubernetes Pod 名称
- 33946 是本地随机分配的端口号
- 远程端: 110.120.10.234:6379
- 110.120.10.234 是目标服务器 IP
- 6379 是标准的 Redis 端口号
- 连接状态: ESTABLISHED(已建立的连接),TCP 可能的连接状态包括:
- ESTABLISHED: 连接已建立并能发送数据
- LISTEN: 服务器在监听端口
- TIME_WAIT: 连接已关闭,等待确保远端收到最后的 ACK
- CLOSE_WAIT: 等待本地用户关闭连接
- SYN_SENT: 正在尝试建立连接
- SYN_RECV: 收到 SYN,等待确认
例 3:日志文件
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
special-c 48 appops 9w REG 8,17 472746831 11272594 /home/app/logs/clear-db.log
- 9w:文件描述符号为 9,w 表示写模式(write-only),这是一个只写文件描述符
- REG:表示这是一个普通文件(regular file)
- 8,17:主设备号: 8(通常表示块设备),次设备号: 17,标识文件所在的具体磁盘分区
- 472746831:文件大小(字节)约等于 451 MB,这是一个相当大的日志文件
- 11272594: 文件的 inode 号,用于在文件系统中唯一标识这个文件
- /home/app/logs/clear-db.log:文件路径