Linux lsof 命令实用示例

LinuxBeginner
立即练习

介绍

在本实验中,你将学习如何使用 lsof 命令(全称为 "list open files")来识别 Linux 系统上打开的文件和网络连接。lsof 命令是一个强大的工具,它提供了有关打开文件的进程的详细信息,包括文件描述符、文件类型、设备和文件名。

本实验涵盖三个主要步骤:理解 lsof 命令、通过进程识别打开的文件以及使用 lsof 定位网络连接。你将学习如何解释 lsof 命令的输出,并使用各种选项来过滤结果。本实验是系统监控与管理课程的一部分,将帮助你培养系统管理和故障排除的技能。

Linux 命令速查表

理解 lsof 命令

在这一步中,你将学习 lsof 命令,它的全称是 "list open files"。lsof 是 Linux 中一个强大的工具,可以帮助你识别哪些进程打开了文件和网络连接。

首先,让我们不带任何参数运行 lsof 命令:

sudo lsof

示例输出:

COMMAND     PID   TID     USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd       1             root  cwd       DIR                8,1      4096          2 /
systemd       1             root  rtd       DIR                8,1      4096          2 /
systemd       1             root  txt       REG                8,1   1428176     655360 /usr/lib/systemd/systemd
systemd       1             root  mem       REG                8,1   2067688     655361 /usr/lib/x86_64-linux-gnu/libc-2.35.so
...

lsof 命令会显示系统中打开的文件和网络连接的详细信息。让我们分解每一列的含义:

  • COMMAND:打开文件的进程名称。
  • PID:进程的 ID。
  • TID:线程 ID(如果适用)。
  • USER:拥有该进程的用户。
  • FD:文件描述符,用于标识打开文件的数字。
  • TYPE:打开文件的类型(例如,普通文件、目录、套接字等)。
  • DEVICE:文件所在文件系统的设备号。
  • SIZE/OFF:文件的大小或文件偏移量。
  • NODE:文件的 inode 号。
  • NAME:文件或网络连接的名称。

输出可能会非常冗长,因此你可以使用各种选项来过滤结果。例如,要查看特定进程打开的文件,可以使用 -p 选项后跟进程 ID:

sudo lsof -p 1

这将显示 PID 为 1 的进程(通常是 systemd 进程)打开的所有文件。

你还可以使用 lsof 命令查找特定用户打开的文件:

sudo lsof -u labex

这将显示 labex 用户拥有的所有打开文件。

在下一步中,你将学习如何使用 lsof 命令识别特定进程打开的文件。

识别进程打开的文件

在这一步中,你将学习如何使用 lsof 命令识别与特定进程关联的打开文件。

首先,我们需要找到正在运行的进程的进程 ID(PID)。你可以使用 ps 命令来完成这一操作:

sudo ps -ef | grep nginx

示例输出:

root         825       1  0 14:32 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data    826     825  0 14:32 ?        00:00:00 nginx: worker process
www-data    827     825  0 14:32 ?        00:00:00 nginx: worker process

在这个例子中,nginx 进程的 PID 是 825。

接下来,你可以使用 lsof 命令列出与该进程关联的所有打开文件:

sudo lsof -p 825

示例输出:

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
nginx   825 root  cwd    DIR  253,0     4096 1048576 /usr/sbin
nginx   825 root  rtd    DIR  253,0     4096       2 /
nginx   825 root  txt    REG  253,0   977528 1048577 /usr/sbin/nginx
nginx   825 root  mem    REG  253,0  2067688 1048578 /usr/lib/x86_64-linux-gnu/libc-2.35.so
nginx   825 root  mem    REG  253,0   169032 1048579 /usr/lib/x86_64-linux-gnu/ld-2.35.so
nginx   825 root    0u   CHR  136,0      0t0       3 /dev/pts/0
nginx   825 root    1u   CHR  136,0      0t0       3 /dev/pts/0
nginx   825 root    2u   CHR  136,0      0t0       3 /dev/pts/0

这个输出显示了与 nginx 进程关联的所有打开文件,包括可执行文件、共享库以及标准输入/输出/错误文件描述符。

你还可以使用 lsof 命令查找特定用户打开的文件。例如,查找 labex 用户拥有的所有打开文件:

sudo lsof -u labex

这对于排查问题或了解系统中特定用户的活动非常有用。

在下一步中,你将学习如何使用 lsof 命令定位网络连接。

使用 lsof 定位网络连接

在这一步中,你将学习如何使用 lsof 命令识别系统中的网络连接。

要列出系统中的所有网络连接,可以使用 lsof 命令并加上 -i 选项:

sudo lsof -i

示例输出:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      824 root   3u  IPv4  18620      0t0  TCP *:22 (LISTEN)
sshd      824 root   4u  IPv6  18622      0t0  TCP *:22 (LISTEN)
nginx    825 root   6u  IPv4  18650      0t0  TCP *:80 (LISTEN)
nginx    826 www-data 6u IPv4  18650      0t0  TCP *:80 (LISTEN)
nginx    827 www-data 6u IPv4  18650      0t0  TCP *:80 (LISTEN)

这个输出显示了系统中的所有网络连接,包括监听端口 22(SSH)的 sshd 进程和监听端口 80(HTTP)的 nginx 进程。

你还可以过滤输出以仅显示特定类型的网络连接。例如,仅显示 TCP 连接:

sudo lsof -i TCP

示例输出:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      824 root   3u  IPv4  18620      0t0  TCP *:22 (LISTEN)
sshd      824 root   4u  IPv6  18622      0t0  TCP *:22 (LISTEN)
nginx    825 root   6u  IPv4  18650      0t0  TCP *:80 (LISTEN)
nginx    826 www-data 6u IPv4  18650      0t0  TCP *:80 (LISTEN)
nginx    827 www-data 6u IPv4  18650      0t0  TCP *:80 (LISTEN)

你还可以过滤输出以仅显示特定用户或进程的网络连接。例如,仅显示 labex 用户的网络连接:

sudo lsof -i -u labex

lsof 命令是一个强大的工具,可以帮助你排查网络问题并了解系统中的网络活动。

总结

在本实验中,你将学习如何使用 lsof 命令,它的全称是 "list open files"。lsof 是 Linux 中一个强大的工具,可以帮助你识别哪些进程打开了文件和网络连接。你将首先不带任何参数运行 lsof 命令,以了解它提供的各种信息列,例如进程名称、进程 ID、文件描述符、文件类型和文件名。接着,你将学习如何使用 -p 选项查看特定进程打开的文件。最后,你将探索如何使用 lsof 命令定位系统中的网络连接。

Linux 命令速查表