简介

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

输出信息含义

在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

直接输入lsof部分输出为:

每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。

lsof输出各列信息的意义如下:

COMMAND:进程的名称 PID:进程标识符

USER:进程所有者

FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等

DEVICE:指定磁盘的名称

SIZE:文件的大小

NODE:索引节点(文件在磁盘上的标识)

NAME:打开文件的确切名称

FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 ,txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。

其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该文件被打开并处于读取/写入模式,而不是只读 ® 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。

与 FD 列相比,Type 列则比较直观。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。

常用参数

lsof语法格式是: lsof [options] filename

lsof abc.txt 显示开启文件abc.txt的进程

lsof -c abc 显示abc进程现在打开的文件

lsof -c -p 1234 列出进程号为1234的进程所打开的文件

lsof -g gid 显示归属gid的进程情况

lsof +d /usr/local/ 显示目录下被进程开启的文件

lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长

lsof -d 4 显示使用fd为4的进程

lsof -i 用以显示符合条件的进程情况

lsof -i[46] [protocol][@hostname|hostaddr][:service|port]

46 --> IPv4 or IPv6

protocol --> TCP or UDP

hostname --> Internet host name

hostaddr --> IPv4地址

service --> /etc/service中的 service name (可以不止一个)

port --> 端口号 (可以不止一个)

lsof使用实例

查找谁在使用文件系统

在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下:

# lsof /GTES11/

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

bash 4208 root cwd DIR 3,1 4096 2 /GTES11/ vim 4230 root cwd DIR 3,1 4096 2 /GTES11/

在这个示例中,用户root正在其/GTES11目录中进行一些操作。一个 bash是实例正在运行,并且它当前的目录为/GTES11,另一个则显示的是vim正在编辑/GTES11下的文件。

要成功地卸载/GTES11,应该在通知用户以确保情况正常之后,中止这些进程。 这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。

恢复删除的文件

当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。 当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。 当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。

假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:

首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:

# lsof |grep /var/log/messages

rsyslogd    884  root    1w      REG              253,0     8306     262652 /var/log/messages (deleted)

从上面的信息可以看到 PID 884(rsyslogd)打开文件的文件描述符为 1。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1884/fd/1 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:

# tall /proc/884/fd/1

Oct 14 10:41:01 Template rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="884" x-info="http://www.rsyslog.com"] rsyslogd was HUPed

Oct 14 10:52:00 Template dhclient[846]: DHCPREQUEST on eth0 to 192.168.61.254 port 67 (xid=0x3a8db478)

Oct 14 10:52:00 Template dhclient[846]: DHCPACK from 192.168.61.254 (xid=0x3a8db478)

Oct 14 10:52:02 Template dhclient[846]: bound to 192.168.61.131 -- renewal in 794 seconds.

Oct 14 10:55:04 Template kernel: hpet1: lost 1 rtc interrupts

Oct 14 10:55:04 Template kernel: hpet1: lost 1 rtc interrupts

Oct 14 10:55:04 Template kernel: hpet1: lost 1 rtc interrupts

Oct 14 10:55:31 Template yum[1569]: Updated: libgcc-4.4.7-23.el6.x86_64

Oct 14 10:55:31 Template yum[1569]: Updated: libstdc++-4.4.7-23.el6.x86_64

Oct 14 10:55:33 Template yum[1569]: Updated: libstdc++-devel-4.4.7-23.el6.x86_64

从上面的信息可以看出,查看 /proc/884/fd/1 就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如:

# cat /proc/884/fd/1 > /var/log/messages

对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。

lsof常用操作

lsof 可以列出被进程所打开的文件的信息。被打开的文件可以是

1.普通的文件,2.目录  3.网络文件系统的文件,4.字符设备文件  5.(函数)共享库  6.管道,命名管道 7.符号链接

8.底层的socket字流,网络socket,unix域名socket

9.在linux里面, 一切皆文件!

怎样使用lsof

这里主要用案例的形式来介绍lsof 命令的使用

1.列出所有打开的文件:

~]# lsof

备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位

2. 查看谁正在使用某个文件

~]# lsof   /filepath/file

3.递归查看某个目录的文件信息

~]# lsof +D /filepath/filepath2/

备注: 使用了+D,对应目录下的所有子目录和文件都会被列出

4. 比使用+D选项,遍历查看某个目录的所有文件信息 的方法

~]# lsof | grep ‘/filepath/filepath2/’

5. 列出某个用户打开的文件信息

~]# lsof  -u username

备注: -u 选项,u其实是user的缩写

6. 列出某个程序所打开的文件信息

~]# lsof -c mysql

备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成lsof | grep mysql,但是第一种方法明显比第二种方法要少打几个字符了

7. 列出多个程序多打开的文件信息

~]# lsof -c mysql -c apache

8. 列出某个用户以及某个程序所打开的文件信息

~]# lsof -u test -c mysql

9. 列出除了某个用户外的被打开的文件信息

~]# lsof   -u ^root

备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示

10. 通过某个进程号显示该进行打开的文件

~]# lsof -p 1

11. 列出多个进程号对应的文件信息

~]# lsof -p 123,456,789

12. 列出除了某个进程号,其他进程号所打开的文件信息

~]# lsof -p ^1

13 . 列出所有的网络连接

~]# lsof -i

14. 列出所有tcp 网络连接信息

~]# lsof  -i tcp

15. 列出所有udp网络连接信息

~]# lsof  -i udp

16. 列出谁在使用某个端口

~]# lsof -i :3306

17. 列出谁在使用某个特定的udp端口

~]# lsof -i udp:55

特定的tcp端口

~]# lsof -i tcp:80

18. 列出某个用户的所有活跃的网络端口

~]# lsof  -a -u test -i

19. 列出所有网络文件系统

~]# lsof -N

20.域名socket文件

~]# lsof -u

21.某个用户组所打开的文件信息

~]# lsof -g 5555

22. 根据文件描述列出对应的文件信息

~]# lsof -d description(like 2)

23. 根据文件描述范围列出文件信息

~]# lsof -d 2-3

实例:

lsof `which httpd` #哪个进程在使用apache的可执行文件

lsof /etc/passwd #哪个进程在占用/etc/passwd

lsof /dev/hda6 #哪个进程在占用hda6

lsof /dev/cdrom #哪个进程在占用光驱

lsof -c sendmail #查看sendmail进程的文件使用情况

lsof -c courier -u ^zahn #显示出那些文件被以courier打头的进程打开,但是并不属于用户zahn

lsof -p 30297 // #显示那些文件被pid为30297的进程打开

lsof -D /tmp #显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列

linux执行lsof命令_linux系统 lsof命令详解相关推荐

  1. linux的docker命令,docker命令_Linux系统Docker命令怎么使用

    摘要 腾兴网为您分享:Linux系统Docker命令怎么使用,自动刷宝,智慧医疗,一路捞,央视影音等软件知识,以及inshot软件,3d虚拟试衣软件,硬件温度监控,配音秀app,4399游戏盒ipho ...

  2. ftp linux 推送文件_Linux文件传输FTP详解

    ftp命令用来设置文件系统相关功能.ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令,相 ...

  3. Linux卸载搜狐,双系统删除教程详解:Windows(linux)双系统,教你如何删除其中一个!...

    3. 随后,点击"引导",可以设置开机的启动系统了 4. 假设我们要删除win10系统,那么我们就将win10操作系统开机引导删除,选择win10然后选择"删除" ...

  4. linux常见命令_Linux系统常见命令

    作者:shangzui 来源:https://blog.csdn.net/gaoshiyuba/article/details/102779726 ###Linux基本命令 Linux系统经典语录: ...

  5. centos7的scp命令_Linux系统scp命令使用教程

    以上简单介绍了4种用法,总之scp的使用命令格式为"scp [可选参数] file_source file_target".具体支持的参数有: -1:强制scp命令使用协议ssh1 ...

  6. linux开机dracut界面_linux开机启动步骤详解

    linux开机启动简单流程图如下: 一.BIOS加电自检 按下电源开关,电脑会首先启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的. BIOS主要做如下工作: 1.检测连接硬件,比如显卡 ...

  7. fstab自动挂载_Linux系统挂载硬盘详解

    最近项目中,要求客户提供了4台Linux服务器用于做大数据集群,但Linux服务器2T硬盘未挂载不能直接用,本篇文章将讲解CentOS环境如何挂载硬盘. 第一步:查看未挂载硬盘 使用命令:fdisk ...

  8. linux给内存卡分区,Android系统手机内存卡分区详解

    这两天刷了2.2版本之后换了个内存卡,问题来了,需要把内存卡分区,下面就让把这两天分区的经验分享一下.不对的地方希望各位能指正,感谢.这里以我的国行G2作为说明,刷的是啊兴的2.2版本.参照了G1的分 ...

  9. linux cp -r 参数,Linux系统中cp命令的参数及用法详解

    Linux系统中cp命令主要是用来复制文件或者目录.下面由学习啦小编为大家整理了Linux系统中cp命令的参数及用法详解的相关知识,希望对大家有帮助! Linux系统中cp命令的参数及用法详解:参数说 ...

最新文章

  1. repo file=sys.stderr 错误解决
  2. android studio 中 .9.png的制作
  3. html+dom+深入,DOM 深入学习 - 1
  4. C++不定长字符串比较合理且简单的解决方法
  5. 完成杂志续订c语言程序,C语言程序设计报告杂志订阅管理软件.doc
  6. 深入浅出MySQL数据库(一)
  7. java httppost 400_java – HTTP状态400 – 必需字符串参数’walletName’不存在
  8. arcgis 4.x graphicslayer点击事件_ArcGis中X、Y值的巧用方法小记
  9. java 短链接url_Java 网址短链接服务原理及解决方案
  10. PAT 乙级 1010. 一元多项式求导 (25) Java版
  11. Socket的通信是基于连接的通信,通信结束时,Socket将不再有用,关闭时为了节约宝贵的系统资源
  12. 搭建rocketMq环境
  13. qtablewidget删除子网格线
  14. layui 表格时间显示问题
  15. latex表格自动换行
  16. 计算机一级B考试总结500字,期中考试总结与反思500
  17. Java-Specification
  18. VS+Qt手动生成moc文件
  19. 通过API接口快速根据关键词获取拼多多商品列表
  20. Pgpool-II + Watchdog 设置与测试

热门文章

  1. Python爬虫——Urllib
  2. android平板电脑汉语字体,动动手换字体:让Android平板电脑更漂亮
  3. Python实现手写体数字图片识别+GUI界面+画板数字识别
  4. Unity3D_Could not produce Class With ID xxx
  5. Python程序设计 大作业 简化的PS
  6. Luma推出分布式路由器,哪里有WIFI死角放哪里
  7. 星空璀璨,时光流逝,分享技术,记录生活——2016年11月22日
  8. PotPlayer不支持S/W HEVC(H.265)解码的解决方法
  9. 异步FIFO的verilog代码实现(包含将满和将空逻辑)
  10. qq邮箱服务器连接错误代码,qq邮箱错误代码103打不开是怎么回事