lsof命令基本使用方法
文章目录
- lsof命令基本使用方法
- 1. lsof介绍
- 1.1 lsof命令使用
- 1.2 lsof中各列信息
- 关于FD的补充说明
- 1.3 lsof的选项信息
- 1.4 具体使用方法和示例
- 1.5 一些疑问
- 2. 文件句柄及空间释放问题
1. lsof介绍
lsof可以查看你所打开的文件、打开文件的进程、甚至可以找回被删除的文件,是一个非常强大的系统管理工具。
1.1 lsof命令使用
- 直接使用lsof就可以看到全部的文件(这边只显示10条方便截图)
1.2 lsof中各列信息
- COMMAND:打开的命令
- PID:进程号
- USER:用户
- FD:文件描述符
FD | 描述 |
cwd | 表示当前目录 |
rtd | 表示根目录 |
txt | 表示执行的程序(例如下面示例中的tail) |
mem | 表示映射到内存的文件(动态链接库) |
012 | 表示标准输入、标准输出、标准错误输出 |
其他数字 | 表示文件对应的文件描述符,无特殊意义 |
- TYPE:文件类型
文件类型 | 描述 |
DIR | 表示目录 |
REG | 表示文件 |
CHR | 表示字符? |
BLK | 表示块设备 |
UNIX | 表示UNIX套接字 |
FIFO | 表示先进先出队列 |
IPv4 | 表示网络协议(IP)套接字 |
- DEVICE:磁盘名称和大小
- SIZE/OFF:文件大小
- NODE:索引节点(文件在磁盘上的标识)
NODE索引节点就是在内核中i-node表中对应的条目,也就是对应的文件。如果两个NODE相同(硬链接情况),说明打开的同样的文件。
如下图在两个终端使用tail查看同一个文件
- NAME:文件名
关于FD的补充说明
- 标准输出、标准输入、标准错误输出(也就是012)后面会跟文件状态
- r: 文件打开且处于只读状态
- w: 文件打开并处于写入状态
- u: 文件被打开并处于读取/写入状态
- -: 状态未知被锁定
- 文件状态后面会跟锁
- R: 锁定读取
- W: 锁定写入
- U: 未知锁
1.3 lsof的选项信息
选项 | 使用描述 | 使用示例 |
-c command | 列出跟command相关的文件 | lsof -c tail |
-d fd | 列出fd相关描述的文件 | lsof -d 3 |
+d dir | 列出dir下打开的文件(不进入文件夹) | lsof +d /proc |
+D dir | 列出dir下打开的文件(递归) | lsof +D /proc |
-p pid | 列出跟pid进程号相关的文件 | lsof -p 156239 |
-u user | 列出用户user相关的文件 | lsof -u yjx |
-i port | 列出所有网络连接(port可以是tcp,upd或指定端口号) | lsof -i tcp:80 |
-a | 后面的两个选项都满足(相当于AND) | lsof -a -c tail -u yjx |
-h | 查看lsof相关帮助 | lsof -h |
-v | 查看lsof版本信息 | lsof -v |
1.4 具体使用方法和示例
# 列出跟tail指令相关的文件
lsof -c tail
# 列出跟用户yjx相关的文件
lsof -u yjx
# 列出跟用户yjx无关的文件
lsof -u ^yjx
# 列出进程号为...的文件
lsof -p 165923
lsof -p 123232,123521
lsof -p ^165 // 除了165开头的
# -a相当于需要同时满足两个条件
lsof -a -c tail -u yjx
# 可以嵌套适用
lsof -a -c tail -a -u yjx -p 166068
# 查看目录下的文件
lsof +d ./
# 递归查找
lsof +D ./
# 根据文件描述符来查看文件
lsof -d 3
lsof -d 0,1
lsof -d 0-2
lsof -d 0-2,cwd,rtd
# 查看网络连接(加入筛选)
lsof -i
lsof -i :80
举个例子,我现在使用tail打开一个文件,并获取到该进程号为169445
- 根据command指令来查看(FD中文件状态r表示的是文件打开且只读)
- 根据进程号来查看
- 查看目录下打开的文件
- 查看/proc目录下打开的文件(递归)
- 根据文件描述符来查看(显示的文件太多,可以多加个筛选)
- 使用-a来增加筛选条件
- 查看tcp网络连接
1.5 一些疑问
为什么一个FD会对应有多个文件信息?
每个进程PCB中有一个文件描述符表,多个进程之间相互独立,之间的文件描述符不冲突。
2. 文件句柄及空间释放问题
可能出现场景: 一个终端正在查看文件,另一个终端将其删除,但是此时磁盘空间并没有完全释放,因为还有进程(查看)在使用这个文件。
可以通过lsof命令看到当前的文件信息
lsof -c tail
可以看到此时文件名后面有一个deleted,说明文件已经被删除,但进程179675还在使用。
只需将这个进程杀死就可以释放对应的磁盘空间。
kill 179675