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 | 文件名或设备名 |