lsof(List Open Files)是一个非常强大的 Linux 命令,用于列出系统中打开的文件。它可以显示系统中所有打开的文件以及与之相关的进程信息。因为在 Linux 中,一切都被视为文件,所以它不仅能够显示常见的磁盘文件,还可以列出网络连接、设备、管道等信息。

常见用法

1. 显示所有打开的文件

lsof

这个命令列出了系统中所有打开的文件。结果通常非常多,因此你可能需要对其进行过滤。

2. 显示特定进程的打开文件

通过指定进程的PID,可以查看该进程打开的文件。

lsof -p <PID>

例如,查看 PID 为 1234 的进程打开的文件:

lsof -p 1234

3. 显示特定用户的打开文件

使用 -u 选项来列出某个用户打开的文件。例如,查看用户 john 打开的文件:

lsof -u john

4. 显示某个文件被哪个进程打开

你可以通过文件名来查找当前打开该文件的进程:

lsof /path/to/file

例如,查看文件 /etc/passwd 是否被某个进程打开:

lsof /etc/passwd

5. 显示所有网络连接

lsof 也可以列出所有打开的网络连接(包括 TCP、UDP 连接)。可以使用 -i 选项:

lsof -i

如果你只关心特定协议(如 TCP 或 UDP),可以指定协议类型:

lsof -i tcp   # 显示所有 TCP 连接
lsof -i udp   # 显示所有 UDP 连接

或者,可以指定端口来查看某个端口的连接:

lsof -i :80   # 查看所有使用端口 80 的连接

6. 显示与特定网络地址相关的连接

你还可以通过网络地址过滤。例如,查看与 192.168.1.1 这个 IP 地址相关的连接:

lsof -i @192.168.1.1

7. 显示某个协议的特定端口连接

查看指定端口的连接。例如,查看 ssh 连接,默认情况下是端口 22

lsof -i :22

8. 显示某个设备的打开文件

通过设备名来查找设备上被打开的文件。比如,查看 /dev/sda1 设备上打开的文件:

lsof /dev/sda1

9. 显示文件打开的详细信息

lsof 命令提供了大量的输出信息,其中包括文件的打开方式、文件的大小等。你可以使用 -F 选项来以不同的格式输出信息。

lsof -F

10. 查看文件句柄信息

如果你想查看特定文件的文件句柄信息,可以使用 -d 选项来指定文件句柄类型。例如,查看打开的文件描述符为 1 的文件:

lsof -d 1

输出解释

lsof 的输出通常包括以下列:

  • COMMAND:打开文件的命令(即进程名)。
  • PID:打开文件的进程的 PID。
  • USER:打开文件的用户。
  • FD:文件描述符。常见的值有:
    • cwd:当前工作目录
    • txt:程序代码(执行文件)
    • mem:内存映射的文件
    • r:读
    • w:写
    • u:读写
    • 0-9:文件描述符编号
  • TYPE:文件类型。例如,REG 表示常规文件,DIR 表示目录,CHR 表示字符设备等。
  • DEVICE:文件所在的设备。
  • SIZE/OFF:文件的大小或偏移量。
  • NODE:文件的 inode。
  • NAME:文件名。

11. 显示文件系统信息

你还可以使用 lsof 来查看特定文件系统的打开文件。例如,要查看系统中 / 文件系统的所有打开文件:

lsof /  # 查看根目录文件系统上的打开文件

12. 查看删除但仍被进程打开的文件

如果你删除了文件,但某个进程仍在使用该文件,你可以使用以下命令查看:

lsof +L1

+L1 选项表示列出所有删除但仍被打开的文件。

13. 配合其他命令使用

你可以将 lsof 命令的输出与其他命令结合使用,进行更复杂的查询或过滤。例如,使用 grep 命令过滤特定的进程名或文件:

lsof | grep 'firefox'

总结

lsof 是一个非常强大的工具,能够帮助你监控和管理系统中打开的文件。它不仅可以查看普通文件,还可以列出网络连接、设备文件、管道等。熟练使用 lsof 可以帮助系统管理员排查问题、监控进程和提高系统管理效率。