Linux lsof命令

介绍

lsof(list open files)是个系统监控工具,用于列出当前系统打开的文件。它不仅可以显示文件的详细信息,还可以根据各种条件进行过滤和筛选,包括普通文件、目录、设备文件、管道文件等。可以访问网络连接和硬件(如TCP和UDP等)。

文件描述符

File Descriptor,简称 FD。从一个常见的例子说起:echo log > /dev/null 2>&1,’>’表示输出结果重定向到哪里,/dev/null 表示空设备文件。也就是将打印信息丢掉,不显示在屏幕上。2&1表示2的输出重定向等同于1。
1 :表示stdout标准输出
2 :表示stderr标准错误
& :表示等同于的意思

也就是 2&1 标准错误输出重定向到标准输出,因为前面标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

在Linux系统中,一切皆文件。如果在用户每一次操作文件时,系统都需要找一次文件名的话,效率会很低下。所以Linux给每一个文件都创建了一个索引。FD就是内核为了高效管理这些已经被打开的文件所创建的索引,这是个非负整数(通常是小整数)。用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。同时还规定系统刚刚启动的时候,0-标准输入,1-标准输出,2-标准错误,如果此时再打开一个文件,那么他的描述符会是3,在打开一个会是4….

Linux内核对所有打开的文件有一个文件描述符表格,里面存储了每个文件描述符作为索引与一个打开文件相对应的关系,简单理解就是下图这样一个数组,文件描述符(索引)就是文件描述符表这个数组的下标,数组的内容就是指向一个个打开的文件的指针。

FD 文件指针 指向文件
0 0xaa1 stdin
1 0xaa2 stdout
2 0xaa3 stderr
3 0xaa4 test.py

基本语法

lsof [OPTIONS] [FILE/DIRECTORY]

  • OPTIONS:选项参数
  • FILE/DIRECTORY:文件名或目录名
选项参数 含义 示例
-a(and) 逻辑“与”操作,用于组合多个选项,只显示同时满足所有条件的记录。 lsof -u user1 -a -p 1234,显示用户 user1 的进程 1234 打开的文件。
-c(command) 列出指定进程名的进程打开的文件。 lsof -c sshd,显示所有进程名为 sshd 的进程打开的文件。
-d(descriptor) 指定文件描述符范围。 lsof -p 1234 -d 3,显示进程PID为 1234 的文件描述符为 3 的文件信息。
-i(internet) 列出系统中所有打开的网络连接,包括 TCP 和 UDP 连接。 lsof -i :端口号 ,查看某个特定端口的使用情况;lsof -i @IP地址,监控特定 IP 地址的连接。lsof -i tcp:列出所有 TCP 连接。lsof -i tcp@192.168.1.1:22:列出与 IP 地址 192.168.1.1 的端口 22 的 TCP 连接。
-n(node name) 不解析主机名,直接显示 IP 地址。 lsof -i -n,显示网络连接时不解析主机名。
-P(port,大写) 不解析端口号,直接显示端口号。 lsof -i -P,显示网络连接时不解析端口号。
-t(terse) 仅显示进程 ID,不显示其他信息。 lsof -t -i :80,仅显示使用端口 80 的进程 ID。
-g(group id) 列出属于特定进程组的进程打开的文件。 lsof -g 123 列出进程组 ID 为 123 的进程打开的文件。
-u(user) 列出用户打开的所有文件 lsof -u root 会列出用户 root 打开的所有文件。这对于排查用户级别的资源占用或安全问题非常有用。

基本功能

列名 含义
command 进程名
PID 进程PID
USER 进程所属用户
FD 文件描述符(如 txt 表示标准输入输出,cwd 表示当前工作目录等)
TYPE 文件类型(如 REG 表示普通文件,DIR 表示目录,SOCK 表示套接字等)
SIZE/OFF 文件大小或偏移量
NODE 文件的 i 节点号
NAME 文件名或设备名