音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

Linux lsof命令使用详解
日期:2020-01-10 11:49:31   来源:脚本之家

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 入手或许可以让你忘记冗长的文档说明,一步步的开始使用并最终掌握这个命令。

参考:
lsof man page
linux lsof命令详解
10 lsof Command Examples in Linux
Linux lsof Command Tutorial for Beginners (10 Examples)
15 Linux lsof Command Examples (Identify Open Files)

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

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    WIN服务器linux服务器FTP服务器DNS服务器其他