如何使用Linux lsof命令

Linux上的Shell提示符Fatmawati Achmad Zaenuri / Shutterstock.com

如果Linux中的所有内容都是文件,则必须有更多内容,而不仅仅是硬盘上的文件。本教程将向您展示怎样使用 lsof的 查看作为文件处理的所有其他设备和进程。

在Linux上,一切都是文件

经常引用的短语,即Linux中的所有内容都是一个文件。文件是字节的集合。当它们被读入程序或发送到打印机时,它们似乎会生成一个字节流。当它们被写入时,它们接受一个字节流。

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

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

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

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

有关: Linux中的“一切都是文件”是什么意思?

lsof命令

许多过程或设备 lsof的 可以报​​告属于root或由root启动,因此您需要使用 须藤 命令用 lsof的

而且因为这个列表将很长,我们将通过它

sudo lsof |减

终端窗口中的lsof

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

lsof:警告:不能stat()fuse.gvfsd-fuse文件系统/ run / user / 1000 / gvfs
输出信息可能不完整。

lsof的 尝试处理所有挂载的文件系统。提出此警告消息是因为 lsof的 遇到过GNOME虚拟文件系统(GVFS)。这是用户空间(FUSE)中文件系统的特例。它充当GNOME,其API和内核之间的桥梁。除了安装它的所有者(在本例中为GNOME)之外,没有人 – 甚至根也不能访问其中一个文件系统。您可以忽略此警告。

输出来自 lsof的 很宽最左边的列是:

终端窗口中最左侧的lsof输出列

最右边的列是:

终端窗口中lsof输出的最右列

列的lsof

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

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

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

  • TID:任务(线程)标识号。空白栏意味着它不是一项任务;这是一个过程。

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

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

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

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

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

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

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

FD专栏

FD列中的文件描述符可以是许多选项之一;手册页列出了所有内容。

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

  • cwd:当前工作目录。

  • 错误:FD信息错误(请参阅NAME列)。

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

  • m86:DOS合并映射文件。

  • mem:内存映射文件。

  • mmap:内存映射设备。

  • pd:父目录。

  • rtd:根目录。

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

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

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

  • r:读访问权限。

  • w:写访问权限。

  • u:读写访问权限。

  • '':空格字符,如果模式未知且没有锁定字符。
  • – :模式未知,并且有一个锁定字符。

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

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

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

  • w:写入部分文件的锁定。

  • W:写入整个文件的锁定。

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

  • U:未知锁定类型。

  • '':一个空间角色。没锁。

TYPE列

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

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

  • DIR:目录。

  • FIFO:先进先出。

  • CHR:字符特殊文件。

  • BLK:阻止特殊文件。

  • INET:Internet套接字。

  • unix:UNIX域套接字

请参阅已打开文件的进程

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

sudo lsof /var/log/kern.log

终端窗口中的sudo lsof /var/log/kern.log

lsof的 通过显示单个进程来响应, rsyslogd 这是由用户启动的 系统日志

lsof输出在终端窗口中

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

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

要查看在中打开的所有文件 在/ var /日志/ 目录,使用此命令:

sudo lsof + D / var / log /

sudo lsof + D / var / log /在终端窗口中

lsof的 响应该目录中所有打开文件的列表。

lsof输出在终端窗口中

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

sudo lsof + D / home

sudo lsof + D / home在终端窗口

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

终端窗口中的lsof outout

列出由进程打开的文件

要查看特定进程已打开的文件,请使用 -C (命令)选项。请注意,您可以提供多个搜索字词 lsof的 立刻。

sudo lsof -c ssh -c init

sudo lsof -c ssh -c init在终端窗口中

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

lsof输出在终端窗口中

请参阅用户打开的文件

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

sudo lsof -u mary

sudo lsof -u mary在终端窗口

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

lsof输出在终端窗口中

排除用户打开的FIles

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

sudo lsof + D / home -u ^ mary

sudo lsof + D / home -u ^ mary在终端窗口

这一次,上市了 /家 目录不包含用户Mary打开的任何文件。

lsof输出在终端窗口中

列出由进程打开的文件夹

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

sudo lsof – p 4610

sudo lsof  -  p 4610在终端窗口

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

lsof输出在终端窗口中

列出已打开文件夹的进程ID

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

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

sudo lsof -t /usr/share/mime/mice.cache在终端窗口中

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

lsof输出在终端窗口中

使用AND和OR搜索

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

sudo lsof -u mary -c ssh

sudo lsof -u mary -c ssh在终端窗口中

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

lsof输出在终端窗口中

这不是我们的预期。发生了什么?

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

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

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

sudo lsof -u mary -c ssh -a

sudo lsof -u mary -c ssh -a在终端窗口中

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

lsof输出在终端窗口中

自动刷新显示

我们可以使用 + | -r (重复)选项 lsof的 进入重复模式。重复选项可以以两种方式应用 + R 要么 -r。我们还必须添加我们想要的秒数 lsof的 等待刷新显示之前。

使用任一格式的重复选项都可以 lsof的 像往常一样显示结果,但它在显示屏的底部添加了一条虚线。它等待命令行上提供的秒数,然后使用一组新结果刷新显示。

随着 -r 选项将继续,直到您按Ctrl + C.随着 + R 格式,它将继续,直到没有结果显示,或直到你按Ctrl + C.

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

sudo lsof -u mary -c ssh -a -r5在终端窗口中

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

lsof输出在终端窗口中

显示与Internet连接关联的文件

-一世 (互联网)选项允许您查看与网络和互联网连接相关的进程打开的文件。

lsof -i

终端窗口中的lsof -i

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

lsof输出在终端窗口中

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

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

在这里,我们正在寻找由互联网或网络连接打开的文件,ID为606的进程。

sudo lsof -i -a -p 606

终端窗口中的lsof -i

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

lsof输出在终端窗口中

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

我们可以使用 -C (命令)选项查找由特定进程打开的文件。查找已通过互联网或与之关联的网络连接打开的文件 SSH 进程,使用以下命令:

lsof -i -a -c ssh

lsof -i -a -c ssh在终端窗口中

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

lsof输出在终端窗口中

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

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

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

lsof -i:22

lsof -i:终端窗口中的22

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

lsof输出在终端窗口中

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

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

sudo lsof -i tcp

sudo lsof -i tcp在终端窗口中

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

lsof输出在终端窗口中

我们只抓过表面

这是一些常见用例的良好基础 lsof的,但还有更多的东西。手册页超过2,800行的事实可以判断多少。

lsof的 命令可用于深入钻取打开文件和伪文件的层次。我们提供了一幅草图;地图集在手册页中。

body #primary .entry-content ul#nextuplist list-style-type:none; margin-left:0px; padding-left:0px;
body #primary .entry-content ul#nextuplist li a text-decoration:none; color:#1d55a9;

请阅读下一步

  • >怎样加快PlayStation 4的下载速度
  • >怎样在Windows 10上禁用登录屏幕的背景模糊
  • >怎样使用所有Linux的搜索命令
  • >怎样在Windows 10上查看所有已保存的Wi-Fi密码
  • >骨传导耳机怎样工作?
本文机器自动生成,不保证语句完整通顺和表达准确,亦不对内容真实有效性负责,请读者知悉。