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

如何在CentOS 7上安装Oxwall

如何在CentOS 7上安装Oxwall

Oxwall是一个开源社交网络软件平台,可用于免费构建自定义社交网站(SNS)。在这篇文章中,

如何在Ubuntu 16.10上安装Review Board

如何在Ubuntu 16.10上安装Review Board

使用其他系统?Review Board是一个免费且开源的工具,用于检查源代码,文档,图像等。这是基于网络的软件战

如何在Debian 9 LAMP VPS上安装October 1.0 CMS

如何在Debian 9 LAMP VPS上安装October 1.0 CMS

使用其他系统?October 1.0 CMS是基于Laravel框架构建的简单,可靠,免费和开源的内容管理系统(CMS)

如何使用Ubuntu 15.10在Vultr服务器上安装Xubuntu桌面

如何使用Ubuntu 15.10在Vultr服务器上安装Xubuntu桌面

Xubuntu是XFCE + Ubuntu!XFCE是Ubuntu的轻量级GUI /桌面。Vultr服务器需要其他依赖项,默认情况下未安装这些依赖项。

如何在Debian 9上安装Monica

如何在Debian 9上安装Monica

使用其他系统?Monica是一个开源的个人关系管理系统。可以将其视为CRM(销售团队使用的一种流行工具

如何使用SSL和安全密码保护由Nginx驱动的网站

如何使用SSL和安全密码保护由Nginx驱动的网站

简介SSL(代表安全套接字层)及其后续版本TLS(代表传输层安全性)是需要加密的加密协议。

如何在Fedora 26 LAMP VPS上安装MODX Revolution

如何在Fedora 26 LAMP VPS上安装MODX Revolution

使用其他系统?MODX Revolution是一种快速,灵活,可扩展,免费和开源的企业级内容管理系统(CMS),由

如何在Ubuntu 17.04上安装JuliaLang

如何在Ubuntu 17.04上安装JuliaLang

朱莉娅(Julia)通常称为JuliaLang,是一种用于数值计算的编程语言。Julia的速度和C一样快,但是却不牺牲可读性

在Ubuntu 14.04上安装Ruby on Rails

在Ubuntu 14.04上安装Ruby on Rails

Ruby on Rails(RoR)是用Ruby编程语言编写的框架,可让您将Ruby与HTML,CSS和类似的程序结合使用。

在Fedora 28上安装Anchor CMS

在Fedora 28上安装Anchor CMS

使用其他系统?Anchor是用PHP编写的轻量级开源博客CMS。Anchors源代码托管在GitHub上。本指南将向您展示

将Debian 9升级到Debian 10

将Debian 9升级到Debian 10

简介Debian 10(Buster)是Debian 9(Stretch)的后继产品。它于2019年7月6日发布。在本教程中,我们将升级一个existin

如何管理Linux服务器时区设置

如何管理Linux服务器时区设置

在Linux服务器上正确设置日期和时间非常重要。您的服务器日志和其他重要信息都将反映时区

如何在Ubuntu 16.04上安装Taiga项目管理工具

如何在Ubuntu 16.04上安装Taiga项目管理工具

使用其他系统?Taiga是用于项目管理的免费和开源应用程序。与其他项目管理工具不同,Taiga使用增量

在Ubuntu上配置Nagios:第1部分-Nagios服务器

在Ubuntu上配置Nagios:第1部分-Nagios服务器

本文是有关在Ubuntu 14.04上安装和配置Nagios的2部分系列文章的一部分。第1部分:Nagios服务器第2部分:远程主机概述Nagio

如何访问Vultr VPS

如何访问Vultr VPS

Vultr提供了几种不同的方式来访问VPS以进行配置,安装和使用。访问凭据VPS ar的默认访问凭据

如何在Debian 9上安装Grav CMS

如何在Debian 9上安装Grav CMS

使用其他系统?Grav是用PHP编写的开源平面文件CMS。Grav源代码公开托管在GitHub上。本指南将向您展示如何

如何在Fedora 26 LAMP VPS上安装Pagekit 1.0 CMS

如何在Fedora 26 LAMP VPS上安装Pagekit 1.0 CMS

使用其他系统?Pagekit 1.0 CMS是一个美观,模块化,可扩展,轻量级,免费和开源的内容管理系统(CMS),具有

如何在Ubuntu 16.04 LAMP VPS上安装BigTree CMS

如何在Ubuntu 16.04 LAMP VPS上安装BigTree CMS

使用其他系统?BigTree CMS 4.2是一种快速,轻量级,免费和开源的企业级内容管理系统(CMS),具有广泛的功能。

如何在CentOS 7上设置vsFTPd

如何在CentOS 7上设置vsFTPd

FTP是用于通过Internet传输文件的有用协议,本指南将向您展示如何设置vsFTPd(非常安全的文件传输协议守护程序)o

在Debian / Ubuntu中使用Rsync设置文件镜像

在Debian / Ubuntu中使用Rsync设置文件镜像

简介如果您经营一个重要的网站,则最好将文件镜像到辅助服务器。如果您的主服务器有网络

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg可以避免系统污染,确保仅安装必要的依赖关系。

如何在Ubuntu 16.04上安装OpenSIPS控制面板

如何在Ubuntu 16.04上安装OpenSIPS控制面板

快速学习如何在Ubuntu 16.04上安装OpenSIPS控制面板,为VoIP提供商提供支持的功能。

在Fedora 28上安装Akaunting

在Fedora 28上安装Akaunting

学习如何在Fedora 28上安装Akaunting,一款适合小型企业和自由职业者的开源会计软件。

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

使用其他系统?Mailtrain是一个基于Node.js和MySQL / MariaDB构建的开源自托管新闻通讯应用程序。

诊断Minecraft服务器延迟和低TPS

诊断Minecraft服务器延迟和低TPS

了解導致Minecraft延遲的原因和解決方案,包括優化伺服器性能和減少滯後的步驟。

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 機器變磚。閱讀這篇文章以了解更多信息