lsof(list open files)命令是一个强大的工具,用于列出系统中所有打开的文件。在Linux系统中,一切皆文件,包括普通文件、目录、网络套接字、管道等。

基本用法

关键选项

选项 描述
无选项 列出所有活跃进程打开的文件
-a 结果进行”与”运算(默认是”或”运算)
-l 显示用户ID而不是用户名
-h 显示帮助信息
-t 仅返回进程ID
-U 显示UNIX套接字地址
-F 格式化输出结果,用于其他命令
-c 显示指定命令打开的文件
-p 显示指定进程ID打开的文件
-u 显示指定用户打开的文件
-i 显示网络连接
-d 显示指定文件描述符的文件

网络连接信息

显示所有网络连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 显示所有网络连接
lsof -i

# 仅显示IPv4连接
lsof -i 4

# 仅显示IPv6连接
lsof -i 6

# 仅显示TCP连接
lsof -iTCP

# 仅显示UDP连接
lsof -iUDP

端口相关

1
2
3
4
5
6
7
8
# 显示指定端口的连接
lsof -i :22

# 显示多个端口的连接
lsof -i :80,443

# 显示指定范围内的端口
lsof -i :1000-2000

主机和端口组合

1
2
3
4
5
6
7
8
# 显示到指定主机的连接
lsof -i@192.168.1.100

# 显示到指定主机特定端口的连接
lsof -i@192.168.1.100:80

# 显示从指定主机来的连接
lsof -i @192.168.1.100

连接状态

1
2
3
4
5
6
7
8
# 显示正在监听的连接
lsof -i -sTCP:LISTEN

# 显示已建立的连接
lsof -i -sTCP:ESTABLISHED

# 显示已关闭的连接
lsof -i -sTCP:CLOSE_WAIT

用户相关

1
2
3
4
5
6
7
8
# 显示指定用户打开的文件
lsof -u username

# 显示多个用户打开的文件
lsof -u user1,user2

# 显示除指定用户外的所有用户打开的文件
lsof -u ^username

进程和命令相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 显示指定进程ID打开的文件
lsof -p 1234

# 显示多个进程ID打开的文件
lsof -p 1234,5678

# 显示指定命令打开的文件
lsof -c nginx

# 显示命令名以指定字符串开头的进程打开的文件
lsof -c "^java"

# 仅返回进程ID
lsof -t -c java

文件和目录相关

1
2
3
4
5
6
7
8
9
10
11
# 显示与指定文件交互的进程
lsof /path/to/file

# 显示与指定目录交互的进程
lsof +D /path/to/directory

# 递归显示目录及其子目录中的文件
lsof +R 3 /path/to/directory

# 显示删除但仍被进程占用的文件
lsof +L1

高级用法

组合选项

1
2
3
4
5
6
7
8
# 显示指定用户在指定端口上的连接
lsof -a -u username -i :80

# 显示指定进程打开的网络连接
lsof -a -p 1234 -i

# 显示指定命令打开的TCP连接
lsof -a -c nginx -iTCP

格式化输出

1
2
3
4
5
# 仅显示进程ID、命令名、文件描述符和文件名
lsof -F pcfn

# 以空字符分隔的输出
lsof -F0 pcfn

查找占用文件的进程

1
2
3
4
5
# 查找占用某个文件的进程
lsof /path/to/locked/file

# 查找占用某个目录的进程
lsof +D /path/to/directory

查找网络问题

1
2
3
4
5
6
7
8
# 查找哪个进程占用了80端口
lsof -i :80

# 查找所有监听状态的端口
lsof -i -sTCP:LISTEN

# 查找与特定IP的连接
lsof -i @192.168.1.100

实用示例

1. 查找占用端口的进程

1
2
3
4
5
# 查找占用8080端口的进程
lsof -i :8080

# 查找占用8080端口的进程ID
lsof -t -i :8080

2. 查找进程打开的文件

1
2
3
4
5
# 查找nginx进程打开的所有文件
lsof -c nginx

# 查找PID为1234的进程打开的网络连接
lsof -p 1234 -i

3. 查找用户活动

1
2
3
4
5
# 查找用户john打开的所有文件
lsof -u john

# 查找用户john打开的网络连接
lsof -u john -i

4. 查找删除但仍占用的文件

1
2
3
4
5
# 查找已删除但仍被进程占用的文件
lsof +L1

# 查找已删除但仍被nginx占用的文件
lsof -a +L1 -c nginx

输出字段解释

字段 含义
COMMAND 进程名称
PID 进程ID
USER 进程所有者
FD 文件描述符
TYPE 文件类型
DEVICE 设备号
SIZE 文件大小
NODE 节点号
NAME 文件名或网络连接信息

文件描述符类型

类型 含义
cwd 当前工作目录
txt 可执行文件
mem 内存映射文件
mmap 内存映射设备
rtd 根目录
0 标准输入
1 标准输出
2 标准错误
u UDP套接字
t TCP套接字

常见问题解决

1. 端口被占用

问题:启动服务时提示端口已被占用

解决方案

1
2
3
4
5
# 查找占用端口的进程
lsof -i :端口号

# 终止占用端口的进程
kill $(lsof -t -i :端口号)

2. 磁盘空间不足但看不到大文件

问题:磁盘空间不足,但找不到大文件

解决方案

1
2
3
4
# 查找已删除但仍被进程占用的文件
lsof +L1

# 重启占用文件的进程释放空间

3. 查找可疑连接

问题:发现可疑的网络连接

解决方案

1
2
3
4
5
# 查看所有网络连接
lsof -i

# 查看已建立的连接
lsof -i -sTCP:ESTABLISHED

性能考虑

  • lsof命令会扫描系统中所有打开的文件,可能会消耗较多系统资源
  • 在大型系统上,lsof可能需要较长时间才能完成
  • 对于频繁执行的场景,建议使用 -t 选项只返回PID,减少输出量

参考资料