【Linux】常用命令:lsof

时间:2024-03-19 10:38:05

1 简介

list open files:一个可以列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件,系统为应用程序分配文件描述符,它可以提供应用程序与操作系统之间的交互接口。

2 使用

3607是mysql的PID,我们先看看mysql所打开的文件:

【Linux】常用命令:lsof

  • 第一个红框各列字段说明:

COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。
TYPE:文件类型
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

其他:如父进程PPID,需要添加参数-R,更多命令可以通过lsof -help或者man lsof来了解

  • 第二个红框发现打开的文件居然还有删除的文件,那么文件都删了,怎么还会占用句柄呢?这个文件可以恢复么?

1、确认文件不存在

【Linux】常用命令:lsof

2、发现/proc目录下还保留着已删除文件的副本,查找方式 /proc/{PID}/fd/{句柄号},句柄号查看lsof结果的FD列(4u)得知

【Linux】常用命令:lsof

3、将删除文件恢复

【Linux】常用命令:lsof

3 常用场景

  • 统计系统中当前打开的总文件句柄数:lsof|awk '{print $2}'|wc -l

awk '{print $2}':打印每行的第二列即PID;wc -l:统计求和

  • 根据打开文件句柄的数量降序排列,其中第二列为进程ID:lsof|awk '{print $2}'|uniq -c|sort -nr|more

uniq -c:在每列旁边显示该行重复出现的次数,并去除重复的行;sort -nr:按重复次数的数值进行逆序排列;more:太多啦

  • lsof filename 显示打开指定文件的所有进程
  • lsof -p pid 显示本进程打开的文件列表
  • lsof -u username 显示username打开的文件
  • lsof -c command 显示COMMAND列中包含指定字符的进程打开的文件
  • lsof -d FD 显示指定文件描述符的进程
  • 查看谁在使用某个特定的udp端口:lsof -i udp:514,特定的tcp端口:lsof -i tcp:80
  • 查看某个IP的连接信息:lsof -i @192.168.1.1:80,443,端口可选,可多个
  • 递归查看某个目录的文件信息:lsof +D /home/omc/  

其他:ulimit -a可以用于查询当前最大打开文件数限制;cat /proc/3653/limits |grep 'Max open files'可以查看当前进程的最大文件句柄设置;修改/etc/security/limits.conf文件的值可以修改最大句柄值,如下图:

【Linux】常用命令:lsof

注:soft不能高于hard,且hard只能修改一次。

 


爱家人,爱生活,爱设计,爱编程,拥抱精彩人生!