如何在 Linux 上列出进程的打开文件

对进程使用“lsof”命令的指南

如果您经常使用 Linux 或 Unix 系统,那么您肯定听说过“在 Linux 中,一切都是文件”这句话。这可能被归类为概念的过度简化,但事实证明它非常有助于理解 Linux 系统中的文件如何工作。

并非所有出现在 Linux 环境中的东西都必须是一个文件。有时它可以是一个进程,也可以是一个表示硬件信息、目录和其他内容的特殊文件。

本教程将引导您找到在 Linux 中为特定进程打开的所有文件。

简介 lsof 命令

Linux 系统的美妙之处在于你可以通过终端来控制和管理你的整个系统,前提是你熟悉命令。一旦知道命令,终端上的所有任务就变得轻而易举了。

lsof 代表 '打开文件列表'.一旦您知道该命令的长版本,您就可以很容易地以高效的方式理解和使用该命令。

lsof 命令显示打开的文件、套接字和管道的列表。您可以使用此命令轻松搜索打开的文件。当。。。的时候 lsof 命令不带任何选项使用它显示与正在运行的活动进程相关的所有打开文件。

笔记: 确保你使用 须藤 在执行命令时。

使用 lsof 命令

我们将研究输出 lsof 命令详细。研究以下命令。

须藤lsof |较少的

笔记: 如果我们直接运行 lsof 命令,输出将非常大,可能会造成混淆以进一步进行。因此,我在这里使用了 lsof |较少的 命令以方便教程。

输出:

gaurav@ubuntu:~$ sudo lsof |少命令 PID TID 用户 FD 类型设备大小/关闭节点名称 kdevtmpfs 31 root cwd DIR 0,6 4400 2 / kdevtmpfs 31 root rtd DIR 0,6 4400 2 / kdevtmpfs 31 root txt unknown root cwns/312 DIR 8,8 4096 2 / netns 32 root rtd DIR 8,8 4096 2 / netns 32 root txt unknown /proc/32/exe rcu_tasks 33 root cwd DIR 8,8 4096 2 / rcu_tasks 33 root, rtd 4096 / rcu_tasks 33 根 txt 未知 /proc/33/exe kauditd 34 根 cwd DIR 8,8 4096 2 / kauditd 34 根 rtd DIR 8,8 4096 2 / kauditd 34 根 txt 未知 /proc/34/exe 

以下是使用 lsof 命令。

范围描述
命令显示打开文件的命令的名称。
PID打开文件的进程的进程标识符号。
工贸部线程标识符号。它可以是一个线程或一个任务编号。
用户作为进程所有者的用户 ID 或名称。
FD显示文件的文件描述符。
类型与文件关联的节点类型。
设备显示设备编号。
尺寸/关闭以字节为单位显示文件的大小。
节点显示目录或父目录的 inode 编号。
名称显示进程所在的文件系统的名称。

列出进程

首先,获取正在运行的进程及其各自的进程 ID 对您来说很重要。 Linux 提供了各种命令来列出进程及其属性,如 PID、用户、目录等。

您可以使用以下命令 最佳, ps, , pstree 列出终端上的进程。

在整个教程中,我将使用 最佳 命令这样做。这 最佳 命令提供正在运行的系统的动态实时视图。它还显示当前由 Linux 内核管理的所有进程和线程。研究下面给出的块以检查输出 最佳 命令。

句法:

须藤顶

输出:

gaurav@ubuntu:~$sudo top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2703 gaurav 20 0 4286124 1.142g 103584 R 88.2 30.5 87:48.08 205 87 87 07 86 08 206 08 206 206 06 34.41的mongod 13765拉夫20 0 2931568 131408 47496 5.9š3.3 1:42.34 Web内容1个根部20 0 225904 6824 4900秒0.0 0.2 0:27.25 systemd 2根20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd 4根0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq 7 root 20 0 0 0 0 S 0.0 0.0 9 0 ksoft root 0.0 0.0 0 0:0 0 0 I 0.0 0.0 0:22.32 rcu_sched 9 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_bh 10 root rt 0 0 0 0 S 0.0 0.0 0:03.13 迁移/ 

在上面的块中,我们可以在一个地方看到所有与进程相关的信息。从这里我们可以找到 PID 我们必须使用 lsof 命令。

但是,如果您只想找出特定进程的进程 ID 并避免其他不需要的进程,请使用以下命令。

句法:

须藤顶| grep [进程名称]

例子:

gaurav@ubuntu:~$ top |用grep终端13819拉夫20 0 803336 19728 9160š0.3 0.5 0:53.63侏儒端 -  13819拉夫20 0 803336 19728 9160š1.0 0.5 0:53.66侏儒端 -  13819拉夫20 0 803336 19728 9160š0.3 0.5 0:53.67侏儒-终端- gaurav@ubuntu:~$

这里我们专门显示了进程名称中包含字符串“终端”的进程的进程ID。当您不知道完整的进程名称或 PID 时,此方法会派上用场。

使用 PID 显示与进程相关的打开文件

在上面的块中,我们学习了如何在 top 命令的帮助下获取进程相关信息。现在我们将使用 PID 对应于系统上的任何进程,并尝试使用 lsof 命令。

从上面给出的输出中,让我们采取与突出显示的 PID 1173 对应的进程。我们将使用 lsof -p [PID] 命令这样做。

句法:

须藤 lsof -p [PID]

该命令以进程的PID为输入,列出该PID对应的所有文件。

输出:

gaurav@ubuntu:~$ sudo lsof -p 1173 lsof: WARNING: can't stat() fuse.gvfsd-fuse 文件系统 /run/user/1000/gvfs 输出信息可能不完整。命令 PID 用户 FD 类型 设备大小/关闭节点名称 mongod 1173 mongodb cwd DIR 8,8 4096 2 / mongod 1173 mongodb rtd DIR 8,8 4096 2 / mongod 1173 mongod/873888888888888988888888888888888888888888888886 1173 mongodb mem REG 8,8 71776 2624380 /lib/x86_64-linux-gnu/libnss_myhostname.so.2 mongod 1173 mongodb mem REG 8,8 101168 2624643 /lib/64-linux-gnu/libnss_myhostname.so.2 mem REG 8,8 26936 2624439 /lib/x86_64-linux-gnu/libnss_dns-2.27.so mongod 1173 mongodb mem REG 8,8 10160 2626002 /lib/x86_64_64-linux-gnu/libnss_dns-2.27.so mongod 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so mongod 1173 mongodb mem REG 8,8 3004224 2909671 /usr/lib/locale/locale-archive/locale-archive 18201000000000 lib/x86_64-linux-gnu/libc-2.27.so mongod 1173 mongodb mem REG 8,8 144976 2624627 /lib/x86_64-linux-gnu/libpthread-2.27.so mongod 1173 / REG696264mgodb, megod 1173 x86_64-linux-gnu/libgcc_s.so.1 mongod 1173 mongodb 我m REG 8,8 1700792 2622735 /lib/x86_64-linux-gnu/libm-2.27.so mongod 1173 mongodb mem REG 8,8 14560 2621535 /lib/x86_64-linux.so117mongodmgod.so mongod 8,8 31680 2624646 /lib/x86_64-linux-gnu/librt-2.27.so mongod 1173 mongodb mem REG 8,8 2357760 2890079 /usr/lib/x80_64-linux.soun.libau.crypto :~$

为进程 ID 为 1713 的进程打开的文件使用 lsof 命令。

笔记: GNOME 用户可能会遇到以下警告。您可以放心地忽略它。

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

使用进程名称列出与进程相关的打开文件

lsof 命令还为您提供了一个选项来使用进程的名称列出打开的文件。名称应作为输入字符串提供给命令。请参阅下面的语法以使用此选项。

句法:

sudo lsof -c [进程名称]

例子:

须藤 lsof -c mysql

输出:

gaurav@ubuntu:~$ sudo lsof -c mysql lsof: WARNING: can't stat() fuse.gvfsd-fuse 文件系统 /run/user/1000/gvfs 输出信息可能不完整。命令 PID 用户 FD 类型 设备尺寸/关闭节点名称 mysqld 1266 mysql cwd DIR 8,8 4096 3154135 /var/lib/mysql mysqld 1266 mysql rtd DIR 8,8 4096 2 / mysqld 126REG6,8161818181989 /sbin/mysqld mysqld 1266 mysql mem REG 8,8 6288 5505444 /usr/lib/mysql/plugin/auth_socket.so mysqld 1266 mysql DEL REG 0,18 28127 /[aio] mysqld 1266 , mysql8126 REG[ aio] mysqld 1266 mysql DEL REG 0,18 28125 /[aio] mysqld 1266 mysql mem REG 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so REG6628591 mysqld 1266 mysql mem REG 8,8 47568 lib/x86_64-linux-gnu/libnss_nis-2.27.so mysqld 1266 mysql mem REG 8,8 39744 2624438 /lib/x86_64-linux-gnu/libnss_compat-2.27.so 

输出将与使用进程 ID 而不是进程名称的输出相同。

列出网络连接打开的文件

在 Linux 中,文件也可以是关于您的网络连接、硬件连接等信息的形式。我们可以使用 lsof 命令列出网络连接打开的文件。使用以下方法。

须藤 lsof -i

输出:

gaurav@ubuntu:~$ sudo lsof -i 命令 PID 用户 FD 类型设备大小/关闭节点名称 systemd-r 969 systemd-resolve 12u IPv4 17357 0t0 UDP localhost:domain systemd-r 969 systemd-resolve 13u5 localhost 17t localhost域(收听) systemd-r 969 systemd-resolve 15u IPv4 1685575 0t0 UDP ubuntu:48090->_gateway:domain avahi-dae 1028 avahi 12u IPv4 23810 0t0 UDP *:mdns 1685575 UDP-mdns 10000000000000000000000000000000000000000000000000000000000000000000000010000000001000000010000000000000000010000000000100000010000001000010000603010UDP30303030UDP30100000000000000000000000001的avahi-DAE 1028的avahi 14U的IPv4 23812 0t0 UDP *:58999的avahi-DAE 1028的avahi 15U的IPv6 23813 0t0 UDP *:37512的mongod 1173 mongodb的6U的IPv4 28149 0t0 TCP本地主机:27017(LISTEN)MYSQLD 1266 MySQL的19U的IPv4 25992 0t0 TCP本地主机: mysql (听) apache2 1283 root 4u IPv6 28140 0t0 TCP *:http (听) gaurav@ubuntu:~$

在这里我们可以看到有关使用网络连接打开的文件的信息 lsof -i 命令。

结论

在这个简单的教程中,我们学习了如何使用各种易于使用的方法在 Linux 中列出进程的打开文件。欲了解更多用途 lsof 命令,见 lsof 手册页。