首页 > 编程知识 正文

Linux执行lsof命令,linux编辑文件命令

时间:2023-05-05 20:46:10 阅读:33950 作者:3079

Linux lsof命令

发布时间: 2019-01-16 08:52、

浏览次数: 841

、标签:

Linux

lsof

列表打开文件(lsof )是一个显示进程打开的文件的工具。

在linux系统上,一切都是文件。 从文件中不仅可以访问常规数据,还可以访问网络连接和硬件。 所以lsof

命令不仅可以显示进程打开的文件、目录,还可以显示有关套接字的信息,如进程监听的端口。 本文介绍了lsof命令的基本用法。 在这篇文章中是demo

的演示环境为ubuntu 18.04。

常用选项

-a表示与其他选项的关系

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

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

d在输出目录和目录下打开的文件和目录(不递归) ) ) ) ) ) ) )。

d递归输出和目录下打开的文件和目录

-i输出满足条件的网络相关文件

-n不解析主机名

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

-不分析p端口号

-仅输出-tPID

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

-U打印打开的UNIX域套接字文件

-h显示帮助信息

显示-v版本信息

基本输出

如果没有选项,lsof命令将打印系统中所有打开活动进程的所有文件。 结果,就会被输出的信息淹没,没有意义。 首先我们必须

lsof命令输出在当前Bash流程中打开的文件,然后剪切部分结果以说明输出中包含的信息。

命令:程序的名称

PID :进程标识符

用户:进程所有者

软盘: APP应用程序通过文件描述符识别文件的文件描述符

类型: dir、REG等文件类型

请用逗号分隔设备编号

SIZE :文件的大小(字节)

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

NAME :要打开的文件的准确名称

简要介绍软盘列和类型列的一般内容。

软盘列的常见内容包括cwd、rtd、txt、mem和一些数字。 cwd表示当前的工作目录。 rtd表示根目录; txt

表示程序的可执行文件mem表示内存映射文件。

一些软盘显示为数字。 例如,标准输入输出文件:

数字后面的字符表示进程对文件的读写模式。 例如,上图中的u表示文件已打开并处于读/写模式。 除了u之外,r表示只读模式,w

表示只读模式。 也可以同时应用w,以指示进程具有文件写入操作的锁定。 下图显示了由剪辑的docker daemon进程打开的文件列表,其中显示了软盘的各种模式。

TYPE列中常见的REG和DIR分别表示常规文件和目录。 CHR和BLK分别表示字符和块设备、unix、fifo、IPv4/IPv6

表示UNIX域套接字、先进先出(FIFO )队列和IPv4/IPv6套接字。

以下是lsof命令的一些常用用法。

检查打开文件的过程

可以直接以lsof参与者的身份指定文件的名称,以查看哪个进程打开了此文件。 以下命令查询打开/zgdyl/bash文件的进程。

$ sudo lsof /zgdyl/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)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。