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

If 的Linux中的所有内容都是文件, there has to be more to it than just files on your hard drive. This tutorial will show you how to use lsof to see all the other devices 和 processes that are being handled as files.

在Linux上,一切都是文件

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

许多其他系统组件接受或生成字节流,例如键盘,套接字连接,打印机和通信过程。因为它们接受,生成或接受并生成字节流,所以可以处理这些设备—at a very low level—好像它们是文件。

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

The data 和 program files that reside on your hard disk are plain old filesystem files. We can use the ls command to list them 和 find out some details about them.

How do we find out about all the other processes 和 devices that are being treated as though 他们 were files? We use the lsof command. This lists the open files in the system. 那 is, it lists anything that is being handled as though it were a file.

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

lsof命令

Many of the processes 要么 devices that lsof can report on belong to root 要么 were launched by root, so you will need to use the sudo command with lsof.

And because this listing will be very long, we are going to pipe it through less .

sudo lsof | less

终端窗口中的lsof

Before the lsof output appears GNOME users may see a warning message in the terminal window.

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

lsof tries to process all mounted filesystems. This warning message is raised because lsof has encountered a GNOME虚拟文件系统 (GVFS)。这是一个特殊的情况 用户空间中的文件系统 (保险丝)。它充当GNOME,其API和内核之间的桥梁。没有人—not even root—除了安装文件的所有者(在本例中为GNOME)之外,您可以访问这些文件系统之一。您可以忽略此警告。

The output from lsof is very wide. The leftmost columns are:

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

最右边的列是:

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

lsof列

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

  • 命令:与打开文件的进程关联的命令名称。
  • PID:打开文件的进程的进程标识号。
  • 工业贸易署任务(线程)标识号。空白列表示这不是一项任务;这是一个过程。
  • 用户: User ID 要么 name of the user to whom the process belongs, 要么 the user ID 要么 login of the person that owns the directory in /proc where lsof finds information about the process.
  • FD :显示文件的文件描述符。文件描述符如下所述。
  • 类型:与文件关联的节点类型。音符类型如下所述。
  • 设备:包含设备号(用逗号分隔),特殊字符,特殊块,常规,目录或NFS文件,或标识该文件的内核参考地址。它还可能显示Linux AX.25套接字设备的基地址或设备名称。
  • 大小/关:显示文件大小或文件偏移量(以字节为单位)。
  • 节点:显示本地文件的节点号或服务器主机中NFS文件的节点号或Internet协议类型。它可能显示流的STR或Linux AX.25套接字设备的IRQ或索引节点号。
  • 名称:显示文件所在的安装点和文件系统的名称。

FD 柱

FD 列中的文件描述符可以是许多选项之一。手册页 全部列出.

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

  • 电脑:当前工作目录。
  • :FD信息错误(请参阅“名称”列)。
  • ltx:共享库文本(代码和数据)。
  • m86:DOS合并映射文件。
  • 记忆:内存映射文件。
  • mmap:内存映射的设备。
  • pd:父目录。
  • rtd: 根目录。
  • 文本文件:程序文本(代码和数据)
  • 一个数字,代表文件描述符。

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

  • r:读取访问权限。
  • w:写访问。
  • u:读写访问权限。
  • ‘ ‘:如果模式未知且没有锁定字符,则为空格字符。
  • :模式未知,并且有锁定字符。

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

  • r:读取文件部分的锁定。
  • R:读取整个文件的锁定。
  • w:在文件的一部分上写锁。
  • W:在整个文件上写锁。
  • u:读写任意长度的锁。
  • U:未知的锁定类型。
  • ‘ ‘:空格字符。没有锁

TYPE栏

超过70个条目 可能会出现在“类型”列中。您将看到一些常见的条目:

  • REG:常规文件系统文件。
  • 目录: 目录。
  • 先进先出:先进先出。
  • CHR:字符特殊文件。
  • 黑色:阻止特殊文件。
  • 互联网:Internet套接字。
  • Unix:UNIX域套接字

See Processes 那 Have Opened a File

To see the processes that have opened a certain file, provide the name of the file as a parameter to lsof.  For example, to see the processes that have opened kern.log file, use this command:

sudo lsof /var/log/kern.log

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

lsof responds by displaying the single process, rsyslogd which was started by the user syslog.

终端窗口中的lsof输出

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

To see the files that have been opened from a directory, 和 the processes that opened them, pass the directory to lsof as a parameter. You must use the +D (directory) option.

To see all the files that are open in the /var/log/ directory, use this command:

sudo lsof +D /var/log/

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

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

终端窗口中的lsof输出

To see all the files that have been opened from the /home directory, use the following command:

sudo lsof +D /home

终端窗口中的sudo lsof + D / home

The files have been opened from the /home directory are displayed. Note that with shorter descriptions in some of the columns, the whole listing is narrower.

终端窗口中的lsof outout

列出进程打开的文件

To see the files that have been opened by a particular process, use the -c (command) option. Note that you can provide more than one search term to lsof at once.

sudo lsof -c ssh -c init

sudo lsof -c ssh -c在终端窗口中初始化

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

终端窗口中的lsof输出

查看用户打开的文件

To limit the display to the files that have been opened by a specific user, use the -u (user) option. In this example, we’将查看由Mary拥有或启动的进程打开的文件。

sudo lsof -u mary

sudo lsof -u mary在终端窗口中

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

终端窗口中的lsof输出

排除用户打开的文件

To exclude the files that have been opened by a user, use the ^  operator. Excluding users from the listing makes it easier to find the information you are interested in. You must use the -u option as before, 和 add the ^ character to the start of the user’s name.

sudo lsof +D /home -u ^mary

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

This time, the listing for the /home directory does not include any of the files that have been opened by the user Mary.

终端窗口中的lsof输出

列出进程打开的文件

To list the files that have been opened by a specific process, use the -p (process) option 和 provide the process ID as a parameter.

sudo lsof - p 4610

sudo lsof-终端窗口中的p 4610

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

终端窗口中的lsof输出

Listing Process IDs 那 Have Opened a FIle

To see the process IDs for the processes that have opened a particular file, use the -t (terse) option 和 provide the name of the file on the command line.

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

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

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

终端窗口中的lsof输出

使用AND和OR搜索

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

sudo lsof -u mary -c ssh

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

现在让’s look at the output from lsof. 那 doesn’看起来不对;在输出中有一些由root启动的条目。

终端窗口中的lsof输出

那 isn’我们所期望的。发生了什么?

When you provide multiple search terms lsof will return any file that matches the first search term 要么 第二个搜索词,依此类推。换句话说,它执行“或”搜索。

To make lsof perform an AND search, use the -a (and) option. This means the only files that will be listed will be ones that match the first search term, 第二个搜索词,依此类推。

让’s try that again 和 use the -a option.

sudo lsof -u mary -c ssh -a

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

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

终端窗口中的lsof输出

自动刷新显示

We can use the +|-r (repeat) option to put lsof 进入 repeat mode. The repeat option can be applied in two ways, either +r 要么 -r.  We must also add the number of seconds we want lsof to wait before refreshing the display.

Using the repeat option in either format makes lsof display the results as usual, but it adds a dashed line to the bottom of the display. It waits for the number of seconds provided on the command line 和 then refreshes the display with a new set of results.

With the -r option this will continue until you press Ctrl+C. With the +r format, it will continue until there are no results to display, 要么 until you press Ctrl+C.

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

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

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

终端窗口中的lsof输出

显示与Internet连接相关的文件

The -i (internet) option allows you to see the files opened by processes associated with network 和 internet connections.

lsof -i

终端窗口中的lsof -i

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

终端窗口中的lsof输出

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

To see the files opened by internet connections that are associated with a specific process ID, add the -p option 和 the -a option.

在这里,我们 are looking for files opened by an internet 要么 network connection, by a process with an ID of 606.

sudo lsof -i -a -p 606

终端窗口中的lsof -i

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

终端窗口中的lsof输出

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

We can use the -c (command) option to look for files opened by specific processes. To look for files that have been opened by internet 要么 network connections associated with the ssh process, use the following command:

lsof -i -a -c ssh

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

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

终端窗口中的lsof输出

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

We can make lsof report on the files that were opened by internet 要么 network connections on a specific port. To do this, we use the : character followed by the port number.

在这里,我们’re asking lsof to list the files that have been opened by network 要么 internet connections using port 22.

lsof -i :22

lsof -i:22在终端窗口中

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

终端窗口中的lsof输出

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

We can ask lsof to show the files that have been opened by processes associated with network 和 internet connections, that are using a specific protocol. We can choose from TCP, UDP, 和 SMTP. Let’使用TCP协议,看看能得到什么。

sudo lsof -i tcp

终端窗口中的sudo lsof -i tcp

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

终端窗口中的lsof输出

We’ve只刮擦表面

那 ’s a good grounding in some common use cases for lsof, but there is a lot more to it than that. Just how much more can be judged by the fact 手册页 is over 2,800 lines long.

The lsof command can be used to drill ever deeper 进入 the strata of open files 和 pseudo-files. We’提供了草图;地图集在 手册页.

戴夫·麦凯 戴夫·麦凯
戴夫·麦凯(Dave McKay)在打孔纸带风行时首先使用计算机,从那以后他一直在编程。在IT行业工作了30多年之后,他现在是一名专职技术记者。在他的职业生涯中,他曾担任自由程序员,国际软件开发团队经理,IT服务项目经理,以及最近的数据保护官。 Dave是Linux的宣传者和开源倡导者。
阅读完整的传记»