Lsof介绍

在Linux下,无论对象实际上是文件,设备,目录还是套接字,都将许多对象视为文件。列出文件很容易,它内置了shell ls。但是,如果用户想查看Web服务器进程当前打开了哪些文件,该怎么办?或者该用户是否想找出在某个目录中打开了哪些文件?那就是lsof发挥作用的地方。想象一下lsofls加上“打开文件”。

请注意,尽管BSD可以完成此工作的实用程序有所不同fstat,但其他几种Unix(例如Solaris)也具有lsof。其他平台上的选项和标志以及输出的外观不同,但是通常本文中的知识也应适用于它们。

首先,让我们看一下lsof输出的格式以及如何读取它。lsof没有任何参数的通常输出类似于以下内容。为了便于阅读,已对此进行了修剪。

COMMAND    PID  TID       USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
init         1            root  cwd       DIR              254,1      4096          2 /
init         1            root  rtd       DIR              254,1      4096          2 /
init         1            root  txt       REG              254,1     36992    7077928 /sbin/init
init         1            root  mem       REG              254,1     14768    7340043 /lib/x86_64-linux-gnu/libdl-2.13.so
init         1            root  mem       REG              254,1   1603600    7340040 /lib/x86_64-linux-gnu/libc-2.13.so
init         1            root  mem       REG              254,1    126232    7340078 /lib/x86_64-linux-gnu/libselinux.so.1
init         1            root  mem       REG              254,1    261184    7340083 /lib/x86_64-linux-gnu/libsepol.so.1
init         1            root  mem       REG              254,1    136936    7340037 /lib/x86_64-linux-gnu/ld-2.13.so
init         1            root   10u     FIFO               0,14       0t0       4781 /run/initctl

这些列的含义如下:

  • COMMAND-打开文件所属的进程,在此示例中,所有内容都与关联init
  • PID-所述过程的过程标识号。
  • USER-运行过程的用户。因为init,几乎总是这样root
  • FD-文件的文件描述符,最常见的是:
    • cwd-当前工作目录(您可能会注意到与pwd打印当前工作目录的命令相似)。
    • rtd -进程的根目录。
    • txt-A text file,这可以表示与流程相关的配置文件,也可以表示与流程相关(或属于该流程)的“源代码”。
    • mem -所谓的“内存映射文件”,表示已分配给文件的虚拟内存段(读取:RAM)。
    • 数字-数字代表实际的文件描述符,数字后面的字符是打开文件的方式:
    • r -读。
    • w -写。
    • u - 读和写。
  • TYPE-指定文件的实际类型,最常见的是:
    • REG -常规文件。
    • DIR -目录。
    • FIFO -先进先出。
  • DEVICE-存放文件的设备的主要和次要编号。
  • SIZE-文件大小,以字节为单位。
  • NODE-文件的索引节点号。
  • NAME-文件名。

目前这可能有点不堪重负,但是如果您工作lsof几次,它将很快陷入您的大脑。

如上所述,lsof此处的输出已缩短。没有任何参数或过滤器,将lsof产生数百行输出,这只会让您感到困惑。

有两种解决该问题的基本方法:

  • 使用一个或多个lsof命令行选项来缩小结果范围。
  • 通过例如管道输出grep

由于您不必记住lsof命令行选项,因此后一种选项听起来更舒服,但它通常不那么灵活高效,因此我们将坚持第一种。

假设您要使用自己喜欢的文本编辑器打开文件,并且该文本编辑器告诉您只能以只读模式打开该文件,因为另一个程序已经在访问该文件。lsof将帮助您找出肇事者是谁:

lsof /path/to/your/file

这将产生类似于以下的输出:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
vim 2679 root    5w   REG  254,1   121525 6035622 /root/lsof.txt

显然,您忘记了关闭更旧的会话!当您尝试卸载NFS共享并umount告诉您不能共享,因为某些东西仍在访问已装入的文件夹时,会发生非常类似的问题。再次,lsof可以帮助您确定罪魁祸首:

lsof +D /path/to/your/directory/

注意尾部的斜杠,这很重要。否则,lsof将假定您的意思是常规文件。不要被+前面的标记所迷惑- 除了更为常见的之外lsof,它还有许多命令行选项。输出如下所示:+-

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
mocp    5637  music    4r   REG   0,19 10147719 102367344 /home/Music/RMS_GNU_SONG.ogg

这意味着属于用户的mocp带有PID 的进程打开了一个名为的文件。但是,即使在关闭该过程之后,仍然存在问题-无法卸载NFS卷。5637musicRMS_GNU_SONG.ogg

lsof有一个-c标志,用于显示打开了任意进程名称的文件。

lsof -c mocp

那将产生如下输出:

mocp    9383  music    4r   REG   0,19 10147719 102367344 /home/Music/ANOTHER_RMS_GNU_SONG.ogg

在此示例中,还有另一个mocp正在运行的实例,阻止您卸载共享。关闭该过程后,您要确保用户music没有打开其他可能有问题的文件。lsof具有-u用于显示特定用户打开的文件的标志。请记住,文件并不总是硬盘上的常规文件!

lsof -u music

您还可以传递多个用户,并用逗号分隔:

lsof -u music,moremusic

关于以下行为的重要说明lsof:结果是基于OR的,这意味着您将看到由user music或user 拥有的进程打开的文件结果moremusic。如果要查看两个用户都拥有的匹配结果的结果,则必须传递标志-a

lsof -au music, moremusic

由于这两个用户都在group中musicusers,因此您还可以基于组列出文件:

lsof -g musicusers

您还可以组合命令行标志:

lsof -u music,moremusic -c mocp

or

lsof -u ^music +D /home/Music

在最后一行,我们添加了另一个特殊标志- ^,它代表逻辑NOT。如果运行该命令后输出为空,则卸载很可能会成功。

在前面的示例中,我们主要查看了常规文件。套接字和网络连接如何?

列出所有当前网络连接lsof具有-i标志:

lsof -i

输出看起来类似于我们到目前为止所看到的...

COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
owncloud  3509  myuser   25u  IPv4  44946      0t0  TCP strix.local:34217->myserver.vultr.com:https (ESTABLISHED)
firefox   3612  myuser   82u  IPv4  49663      0t0  TCP strix.local:43897->we-in-f100.1e100.net:https (ESTABLISHED)
ssh       3784  myuser    3u  IPv4  10437      0t0  TCP strix.local:51416->someserver.in:ssh (ESTABLISHED)
wget      4140  myuser    3w  IPv4  45586      0t0  TCP strix.local:54460->media.ccc.de:http (CLOSE_WAIT)

...除了一个区别:该列NAME现在显示连接信息,而不是文件名或目录。每个连接均包括以下部分:

  • 协议。
  • 本地主机名。
  • 连接的源端口。
  • 目标DNS名称。
  • 目的端口。
  • 连接状态。

与许多其他工具一样,您可以选择不解析DNS名称和端口(分别为-n-P)。该标志-i采用其他参数。您可以指定是否要显示tcpudpicmp连接或某些端口:

lsof -i :25
or
lsof -i :smtp

同样,可以组合参数。以下示例...

lsof -i tcp:80

...只会显示使用端口80的TCP连接。您也可以将其与“经典”文件中已知的选项结合使用:

lsof -a -u httpd -i tcp

这将向您显示用户打开的所有TCP连接httpd。注意该-a标志,它更改了默认行为lsof(如前所述)。与大多数命令行工具一样,您可以深入了解。下面仅显示状态为“ ESTABLISHED”的TCP连接:

lsof -i -s TCP:ESTABLISHED

在这一点上,您应该对lsof工作方式以及一些常见的用例有基本的了解。有关更多信息,请参见lsof系统上的联机帮助页。



Leave a Comment

AI 能否應對越來越多的勒索軟件攻擊?

AI 能否應對越來越多的勒索軟件攻擊?

勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根

ReactOS:這是 Windows 的未來嗎?

ReactOS:這是 Windows 的未來嗎?

ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+

人工智能如何將流程自動化提升到新的水平?

人工智能如何將流程自動化提升到新的水平?

閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。

macOS Catalina 10.15.4 補充更新引發的問題多於解決

macOS Catalina 10.15.4 補充更新引發的問題多於解決

最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

什麼是日誌文件系統,它是如何工作的?

什麼是日誌文件系統,它是如何工作的?

我們的計算機以稱為日誌文件系統的有組織的方式存儲所有數據。這是一種有效的方法,可以讓計算機在您點擊搜索時立即搜索和顯示文件。 https://wethegeek.com/?p=94116&preview=true

技術奇點:人類文明的遙遠未來?

技術奇點:人類文明的遙遠未來?

隨著科學的快速發展,接管了我們的大量工作,我們陷入無法解釋的奇點的風險也在增加。閱讀,奇點對我們意味著什麼。

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

2021 年人工智能對醫療保健的影響

2021 年人工智能對醫療保健的影響

過去幾十年,醫療保健領域的人工智能取得了巨大飛躍。因此,醫療保健中人工智能的未來仍在日益增長。