lsof(list open files)是一个查看进程打开的文件的工具。

在 linux 系统中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等 socket 相关的信息。本文将介绍 lsof 命令的基本用法,本文中 demo 的演示环境为 ubuntu 18.04。

常用选项

-a 指示其它选项之间为与的关系

-c 输出指定进程所打开的文件

-d 列出占用该文件号的进程

+d 输出目录及目录下被打开的文件和目录(不递归)

+D 递归输出及目录下被打开的文件和目录

-i 输出符合条件与网络相关的文件

-n 不解析主机名

-p 输出指定 PID 的进程所打开的文件

-P 不解析端口号

-t 只输出 PID

-u 输出指定用户打开的文件

-U 输出打开的 UNIX domain socket 文件

-h 显示帮助信息

-v 显示版本信息

基本输出

如果不带任何选项执行 lsof 命令,会输出系统中所有 active 进程打开的所有文件,结果就是我们被输出的信息所淹没,这没有任何的意义。我们先让 lsof 命令输出当前 Bash 进程打开的文件,并截取其中的一部分结果来介绍输出内容中都包含哪些信息:

COMMAND:程序的名称

PID:进程标识符

USER:进程所有者

FD:文件描述符,应用程序通过文件描述符识别该文件

TYPE:文件类型,如 DIR、REG 等

DEVICE:以逗号分隔设备编号

SIZE:文件的大小(bytes)

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

NAME:打开文件的确切名称

下面简单介绍一下 FD 列和 TYPE 列中的常见内容。

FD 列中的常见内容有 cwd、rtd、txt、mem 和一些数字等等。其中 cwd 表示当前的工作目录;rtd 表示根目录;txt 表示程序的可执行文件;mem 表示内存映射文件:

还有一部分 FD 是以数字表示的,比如标准输入输出文件:

数字后面的字母表示进程对该文件的读写模式,比如上图中的 u 表示该文件被打开并处于读取/写入模式。除了 u,还有 r 表示只读模式,w 表示只写模式,还可以同时应用 W 表示该进程拥有对文件写操作的锁。下图是截取的 docker daemon 进程打开的文件列表,其中显示了 FD 的不同模式:

TYPE 列中常见的 REG 和 DIR 分别表示普通文件和目录。而 CHR 和 BLK 则分别表示字符和块设备,unix、fifo 和 IPv4/IPv6 分别表示 UNIX domain 套接字、先进先出(FIFO)队列和 IPv4/IPv6 套接字。

下面我们来介绍一些 lsof 命令的常见用法。

查看哪些进程打开了某个文件

直接指定文件的名称作为 lsof 的参加就可以查看哪些进程打开了这个文件,下面的命令查询打开了 /bin/bash 文件的进程:

$ sudo lsof /bin/bash

除了普通文件,也可以是设备等文件(下面命令的输出很长,图示只是截取的一小部分):

$ sudo lsof /dev/sda1

查看哪些进程打开了某个目录及目录下的文件

这里分两种情况,+d 选项不执行递归查询,只查找那些打开了指定目录以及指定目录下文件和目录的进程,比如:

$ sudo lsof +d /var/log

而 +D 选项则会对指定的目录进行递归:

$ sudo lsof +D /var/log

在卸载文件系统时,如果有进程打开了该文件系统中的文件或目录,卸载操作就会失败。因此最好在卸载文件系统前通过 lsof +D 检查文件系统的挂载点,杀掉相关的进程然后再执行卸载操作。

查看某个进程打开的所有文件

通过 -p 选项并指定进程的 PID 可以输出该进程打开的所有文件。比如我们想要查看 cron 程序打开的文件,可以先用 ps -C cron 命令查出进程的 PID:

然后把该 PID 传递给 lsof 命令的 -p 选项:

$ sudo lsof -p 1152

组合多个选项

如果为 lsof 命令指定多个选项,这些选项间默认是或的关系。也就是说满足任何一个选项的结果都会被输出。可以添加额外的 -a 选项,它的作用就是让其它选项之间的关系变为与,比如下面的命令:

$ sudo lsof -a -p $$ -d0,1,2

其中的 -p 选项指定了当前进程的 PID,而 -d 选项则用来指定进程打开的文件描述符(可以通过逗号分隔多个文件描述符)。添加 -a 选项后,结果输出为当前进程打开的文件描述符为 0、1、2 的文件。

说明,-a 选项的使用有很多条件,具体请参考 lsof man page。

查看指定名称的程序打开的文件

通过 -c 选项可以匹配进程运行的程序(可执行文件)名称。比如我们要查找以字母 cr 开头的程序打开的文件列表:

$ sudo lsof -c cr

还可以同时指定多个 -c 选项,它们之间是或的关系。

如果想对 -c 选项的条件取反,只要在字符串前添加符号 ^ 就可以了,比如:

$ sudo lsof -c ^cr

-c 选项也支持正则表达式,比如下面的命令可以过滤出以 cra 和 cro 开头的程序打开的文件:

$ sudo lsof -c /cr[ao]/

查看被打开的与网络相关的文件

-i 选项用来查看被打开的和网络相关的文件,其参数的格式如下:

[46][protocol][@hostname|hostaddr][:service|port]

46 表示 IP 协议的版本

protocol 表示网络协议的名称,比如 TCP 或 UDP

hostname 或 hostaddr 表示主机地址

service 指 /etc/services 中的名称,比如 smtp 或多个服务的列表

port 表示端口号,可以指定一个或多个

-i 选项默认会同时输出 IPv4 和 IPv6 打开的文件:

$ sudo lsof -i

只列出 IPv4 或 IPv6 打开的文件

$ sudo lsof -i 4

$ sudo lsof -i 6

列出与 22 号端口相关的文件

$ sudo lsof -i:22

列出指定范围内被打开的 TCP 端口

$ sudo -i TCP:1-1024

查看被打开的 UNIX domain socket 文件

-U 选项输出打开的 UNIX domain socket 文件,这里我们结合 -c 选项来查看 ssh 服务打开的 UNIX domain socket 文件:

$ sudo lsof -a -c sshd -U

查看某个用户打开的所有文件

-u 选项可以指定用户名或 user ID,并且和 -c 选项一样,可以通过逗号分隔多个用户名称或 user ID,也可以通过符号 ^ 对条件取反。

查看某个用户打开的所有文件

$ sudo lsof -u syslog

查看用户 nick 打开的网络相关的文件

$ sudo lsof -a -i -u nick

排除某个用户

$ sudo lsof -i -u ^nick

注意:在有排除条件时,不需要指定 -a 选项。

杀掉某个用户打开了文件的所有进程

$ kill -9 $(lsof -t -u nick)

该命令中的 -t 选项让 lsof 命令只输出进程的 PID:

统计系统打开的文件总数

$ sudo lsof -P -n | wc -l

命令中的 -P 选项表示不解析端口号,-n 选项表示不解析主机名,这两个选项主要的目的是为了提升 lsof 命令的执行速度。wc -l 命令则用来统计 lsof 命令输出的行数。

恢复删除的文件

如果我们一不小心删除了文件,而又知道这个文本被某个进程打开着,就可以通过 lsof 命令来恢复该文件。具体的原理为:

当进程打开了某个文件时,只要该进程保持打开该文件,即使将文件删除,它依然存在于磁盘中。进程并不知道文件已经被删除,它仍然可以通过打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

进程打开的文件描述符就存放在 /proc/PID/fd 目录下。/proc 目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。lsof 程序就是使用这些信息和其他关于内核内部状态的信息来产生其输出。所以 lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是说我们通过访问进程的文件描述符可以找到该文件的相关信息。

下面的 demo 演示如何通过 lsof 命令恢复被误删的 /var/log/syslog 文件。

先删除日志文件 /var/log/syslog,记着要提前备份一下这个文件,以防万一:

$ sudo rm /var/log/syslog

从上面的信息可以看到 PID 为 1141 的进程打开着该文件,文件描述符为 7,并且显示该文件已经被删除了。接下来我们通过 1141 号进程的文件文件描述符来查看该文件的内容:

$ sudo tail -n 5 /proc/1141/fd/7

上图说明文件 /var/log/syslog 文件的内容还在,并且可以通过文件描述符访问,接下来通过 IO 重定向的方式重新创建 /var/log/syslog 文件就可以了:

$ sudo sh -c 'cat /proc/1141/fd/7 > /var/log/syslog'

然后修复文件的权限属性并重启 rsyslog 服务:

$ sudo chown syslog:adm /var/log/syslog

$ sudo systemctl restart rsyslog.service

这样就完成了 /var/log/syslog 文件的恢复工作。对于许多应用程序,尤其是日志文件和数据库文件,都可以通过这种方式来恢复。

帮助

-h 选项会输出 lsof 命令的帮助信息:

估计这样的帮助信息也只能逼着你去读 man page 了!

总结

lsof 并不是一个简单的命令,从其 man page 的长度就可以体会到这一点。从本文介绍的小 demo 入手或许可以让你忘记冗长的文档说明,一步步的开始使用并最终掌握这个命令。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

linux执行lsof命令_Linux lsof命令使用详解相关推荐

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

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

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

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

  3. linux命令ps -aux|grep xxx详解

    linux命令ps -aux|grep xxx详解 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大 ...

  4. linux xxx命令,linux命令ps aux|grep xxx详解

    对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大的进程查看命令. 使用该命令 可以确定有哪些进程正在运 ...

  5. 编程实现linux中的who命令功能,Linux who命令简介及使用方法详解

    玩蛇网推荐图文教程:python 列表 本文是关于Linux who命令简介及使用方法详解一文.如果你是一名系统管理员,可能需要需要在一个特定的时间点都有谁活跃在系统上.以便必须严密监视我们的服务器. ...

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

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

  7. linux dig命令的安装和使用详解

    linux dig命令的安装和使用详解 什么是dig命令 Dig是Domain Information Gopher的缩写,是一种DNS查找实用程序,用于探测DNS服务器并解决与DNS服务器相关的问题 ...

  8. linux添加目录命令权限,linux chmod命令设置目录/文件权限详解

    首页 > Linux教程 > 常用命令 > chmod 文件权限 linux chmod命令设置目录/文件权限详解 linux中chmod命令用于改变系统文件或目录的访问权限,用数字 ...

  9. linux中替换命令详解,linux中sed命令字符串替换的用法详解

    Linux系统中sed命令可以将字符串批量替换,省去了很多麻烦,下面由学习啦小编为大家整理了linux系统中sed命令字符串替换的用法详解,希望对大家有帮助! linux中sed命令字符串替换的用法详 ...

  10. linux环境下blastn命令怎么用,Linux环境下通配符及特殊符号使用详解

    Linux环境下通配符及特殊符号使用详解 我们现在来介绍通配符的使用,通过通配符的过滤,快速找到想找的文件和目录,比如/etc/目录下有上千个目录和文件,不使用通配符想找一个目录和文件是非常麻烦的和花 ...

最新文章

  1. ICML2018见闻 | 迁移学习、多任务学习领域的进展
  2. oracle 删除旧数据,Oracle 删除海量数据下避免Ora-01555快照过旧错误的执行脚本
  3. 自学python后能干什么-学Python后能干什么 郑州Python就业怎么样
  4. nginx配置详解与优化
  5. 【自动驾驶】2.车载以太网 - SOME/IP简介
  6. 编译JDK源代码【转】
  7. django 1.8 官方文档翻译: 3-5-1 使用Django输出CSV
  8. Rust语言学习大纲
  9. 阶段3 3.SpringMVC·_03.SpringMVC常用注解_1 RequestParam注解
  10. Tomcat8卸载+重装
  11. windows7时钟屏保怎么设置_w7时钟屏保怎么设置
  12. python中英文字母和中文汉字所占的字节
  13. 怎么用迅捷PDF转换器在线为PDF文件添加文字内容
  14. vivo信号无服务器,vivo X50上手实测,连央视都夸的国货之光究竟体验如何?
  15. 【Android】自制静音App,解决他人手机外放问题
  16. Docker curriculum (2): 构建自己的镜像
  17. 上海财经应用统计考python_2020上财应用统计432考研高分经验贴
  18. 酒庄页面HTML5,这5家酒庄的“跨界+体验”玩法,让全世界印象深刻
  19. 解决msvcp120d.dll和msvcr120d.dll缺失
  20. 2016年底江浙沪绕行游记

热门文章

  1. like用法--mysql
  2. 个位数统计(C语言)
  3. 国内8大热门android论坛
  4. 如何在LibreOffice中使用所有者和用户密码保护文档和PDF文件
  5. 开源网店系统iWebShop新功能预览(多图)
  6. solidworks安装教程2021
  7. 实验一木马分析(隐藏分析)实验
  8. MyBatis环境搭建
  9. 反渗透设备:反渗透纯水设备中软水器的作用及维护方法
  10. AR9341刷机资料