Linux下lsof命令的用法

lsof命令基本使用方法

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
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值