如何使用Linux lsof命令

时间:2020-01-09 10:39:55  来源:igfitidea点击:

如果Linux中的所有内容都是文件,那么除了硬盘驱动器上的文件之外,还有更多其他内容。本教程将向我们展示如何使用lsof查看正在作为文件处理的所有其他设备和进程。

在Linux上,一切都是文件

Linux上的所有内容都是文件的常被引用的说法是正确的。文件是字节的集合。当将它们读入程序或者发送给打印机时,它们似乎会生成字节流。当它们被写入时,它们接受字节流。

许多其他系统组件接受或者生成字节流,例如键盘,套接字连接,打印机和通信过程。因为它们或者接受,生成,或者接受并生成字节流,所以这些设备可以像文件一样在很低的级别上进行处理。

该设计概念简化了Unix操作系统的实现。这意味着可以创建少量的处理程序,工具和API,以处理各种不同的资源。

硬盘上的数据和程序文件是普通的旧文件系统文件。我们可以使用ls命令列出它们并找出有关它们的一些详细信息。

我们如何找出所有其他被视为文件的其他进程和设备?我们使用lsof命令。这列出了系统中打开的文件。也就是说,它列出了所有正在处理的内容,就好像它是文件一样。

lsof命令

lsof可以报告的许多进程或者设备都属于root或者由root启动,因此我们需要对lsof使用sudo命令。

而且由于该列表将非常长,因此我们将通过less将其传递。

sudo lsof | less

在" lsof"输出出现之前,GNOME用户可能会在终端窗口中看到警告消息。

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information Jan be incomplete.

lsof尝试处理所有已挂载的文件系统。出现此警告消息是因为lsof遇到了GNOME虚拟文件系统(GVFS)。这是用户空间(FUSE)中文件系统的一种特殊情况。它充当GNOME,其API和内核之间的桥梁。除了挂载文件的所有者(在本例中为GNOME)之外,没有人甚至无法访问这些文件系统之一。我们可以忽略此警告。

lsof的输出非常宽。

lsof列

所有列都不适用于每种类型的打开文件。其中一些空白是正常的。

  • 命令:与打开文件的进程关联的命令的名称。

  • PID:打开文件的进程的标识号。

  • TID:任务(线程)标识号。空白列表示它不是任务;这是一个过程。

  • 用户:进程所属的用户的用户ID或者名称,或者拥有在/ proc中的目录的用户的用户ID或者登录名,其中lsof查找有关进程的信息。

  • FD:显示文件的文件描述符。文件描述符如下所述。

  • 类型:与文件关联的节点类型。注释类型如下所述。

  • 设备:包含特殊字符,特殊块,常规,目录或者NFS文件的设备号(用逗号分隔),或者标识该文件的内核参考地址。它还可能显示Linux AX.25套接字设备的基本地址或者设备名称。

  • 大小/关闭:显示文件的大小或者文件偏移量(以字节为单位)。

  • 节点:显示本地文件的节点号或者服务器主机中NFS文件的节点号或者Internet协议类型。它可能显示流的STR或者Linux AX.25套接字设备的IRQ或者索引节点号。

  • 名称:显示文件所在的安装点和文件系统的名称。

FD柱

FD列中的文件描述符可以是许多选项之一。该男子将他们全部列出。

FD列条目可以由三部分组成:文件描述符,模式字符和锁定字符。一些常见的文件描述符是:

  • cwd:当前工作目录。

  • 错误:FD信息错误(请参阅"名称"列)。

  • ltx:共享库文本(代码和数据)。

  • m86:DOS合并映射文件。

  • mem:内存映射文件。

  • mmap:内存映射的设备。

  • pd:父目录。

  • rtd:根目录。

  • txt:程序文本(代码和数据)

  • 一个数字,代表文件描述符。

模式字符可以是以下之一:

  • r:读取访问权限。

  • w:写访问。

  • u:读写访问权限。

  • :如果模式未知且没有锁定字符,则为空格字符。

  • :模式未知,并且有锁定字符。

锁定字符可以是以下之一:

  • r:读取文件部分的锁。

  • R:读取整个文件的锁。

  • w:在文件的一部分上写锁。

  • W:在整个文件上写锁。

  • u:读写任意长度的锁。

  • U:未知的锁定类型。

  • :空格字符。没有锁

TYPE栏

TYPE列中可能会显示70多个条目。我们将看到一些常见的条目:

  • REG:常规文件系统文件。

  • 目录:目录。

  • FIFO:先进先出。

  • CHR:字符特殊文件。

  • BLK:阻止特殊文件。

  • INET:Internet套接字。

  • UNIX:UNIX域套接字

查看已打开文件的进程

要查看打开某个文件的进程,请提供文件名作为lsof的参数。例如,要查看已打开kern.log文件的进程,请使用以下命令:

sudo lsof /var/log/kern.log

" lsof"通过显示单个进程" rsyslogd"来响应,该进程由用户" syslog"启动。

查看从目录打开的所有文件

要查看已从目录打开的文件以及打开它们的进程,请将目录作为参数传递给lsof。我们必须使用+ D(目录)选项。

要查看在/ var / log /目录中打开的所有文件,请使用以下命令:

sudo lsof +D /var/log/

lsof作为响应,列出该目录中所有打开的文件。

要查看已从/ home目录打开的所有文件,请使用以下命令:

sudo lsof +D /home

显示从/ home目录打开的文件。请注意,由于某些列中的描述较短,因此整个列表较窄。

列出进程打开的文件

要查看由特定进程打开的文件,请使用-c(命令)选项。请注意,我们可以一次为lsof提供多个搜索词。

sudo lsof -c ssh -c init

lsof提供了由命令行上提供的任一进程打开的文件的列表。

查看用户打开的文件

要将显示限制为特定用户打开的文件,请使用-u(用户)选项。在此示例中,我们将查看由Mary拥有或者启动的进程打开的文件。

sudo lsof -u mary

列出的所有文件均已代表用户Mary打开。例如,这包括由桌面环境打开的文件,或者仅仅是由于Mary登录而打开的文件。

排除用户打开的文件

要排除用户已经打开的文件,请使用^运算符。从列表中排除用户可以更轻松地找到我们感兴趣的信息。我们必须像以前一样使用-u选项,并在用户名的开头添加^字符。

sudo lsof +D /home -u ^mary

这次," / home"目录的列表不包括用户Mary打开的任何文件。

列出进程打开的文件

要列出由特定进程打开的文件,请使用-p选项(进程)并提供进程ID作为参数。

sudo lsof - p 4610

为我们列出了由我们提供的进程ID打开的所有文件。

列出已打开文件的进程ID

要查看已打开特定文件的进程的进程ID,请使用-t选项,并在命令行上提供文件名。

sudo lsof -t /usr/share/mime/mime.cache

进程ID显示在简单列表中。

使用AND和OR搜索

让我们列出用户Mary打开的与SSH进程相关的文件。我们知道我们可以在命令行上提供多个搜索项目,因此这应该很容易。

sudo lsof -u mary -c ssh

现在让我们看一下lsof的输出。看起来不太对劲;在输出中有一些由root启动的条目。

那不是我们所期望的。发生了什么?

当我们提供多个搜索词时," lsof"将返回与第一个搜索词或者第二个搜索词匹配的任何文件,依此类推。换句话说,它执行"或者"搜索。

要使lsof执行AND搜索,请使用-a(and)选项。这意味着将列出的唯一文件将是与第一个搜索词和第二个搜索词匹配的文件,依此类推。

让我们再试一次,然后使用-a选项。

sudo lsof -u mary -c ssh -a

现在,列表中的每个文件都是由Mary或者代表Mary打开的文件,并且与SSH命令相关联。

自动刷新显示

我们可以使用" + | -r"(重复)选项将" lsof"置于重复模式。可以通过两种方式应用重复选项,即+ r或者-r。我们还必须添加我们希望lsof等待的秒数,以刷新显示。

使用任一种格式的repeat选项可使lsof照常显示结果,但会在显示的底部添加虚线。它等待命令行提供的秒数,然后使用一组新的结果刷新显示。

使用-r选项将一直持续到我们按Ctrl + C。使用+ r格式,它将一直持续到没有结果显示或者按Ctrl + C为止。

sudo lsof -u mary -c ssh -a -r5

请注意列表底部的虚线。刷新输出时,这将分隔每个新的数据显示。

显示与Internet连接相关的文件

-i(internet)选项使我们可以查看与网络和Internet连接关联的进程打开的文件。

lsof -i

显示通过网络和Internet连接打开的所有文件。

按进程ID显示与Internet连接相关的文件

要查看与特定进程ID关联的Internet连接打开的文件,请添加-p选项和-a选项。

在这里,我们正在寻找ID为606的进程通过Internet或者网络连接打开的文件。

sudo lsof -i -a -p 606

显示由进程ID 606打开的所有与Internet或者网络连接相关的文件。

显示与Internet连接和命令关联的文件

我们可以使用-c(命令)选项来查找由特定进程打开的文件。要查找已通过与ssh进程关联的Internet或者网络连接打开的文件,请使用以下命令:

lsof -i -a -c ssh

输出中列出了由于ssh进程而打开的所有文件。

显示与Internet连接和端口相关的文件

我们可以对由特定端口上的Internet或者网络连接打开的文件进行lsof报告。为此,我们使用字符,后跟端口号。

这里我们要求lsof列出使用端口22通过网络或者Internet连接打开的文件。

lsof -i :22

所有列出的文件都是由与端口22(这是SSH连接的默认端口)关联的进程打开的。

显示与Internet连接和协议相关的文件

我们可以要求lsof显示由与网络和Internet连接相关联的进程使用特定协议打开的文件。我们可以从TCP,UDP和SMTP中进行选择,让我们使用TCP协议并看看我们得到了什么。

sudo lsof -i tcp

列出的唯一文件是使用TCP协议的进程打开的文件。