每天一个 Linux 命令(51):lsof 命令

命令简介

lsof(List Open Files)是一个非常强大的命令,用于列出当前系统中所有打开的文件和对应的进程信息。它可以帮助你查看哪些文件被哪些进程打开,常用于排查系统中哪些文件被占用、调试文件锁问题等。

在 Linux 中,几乎一切都是文件,包括硬件设备、目录、管道和网络连接。因此,lsof 命令不仅可以列出常规文件,还能列出设备文件、网络套接字等信息。

基本语法

lsof [选项] [文件/目录/进程ID]

常见选项及说明

  • -i:列出所有网络连接。
    • -i :80:列出所有 80 端口的网络连接。
    • -i 4:列出所有 IPv4 连接。
    lsof -i :80
  • -u:显示特定用户打开的文件。lsof -u 用户名
  • -t:仅显示进程ID(PID),用于在脚本中获取 PID。lsof -t -i :80
  • -p:显示指定进程(PID)打开的文件。lsof -p <PID>
  • -n:以数字形式显示主机地址(不进行域名解析),提高执行效率。lsof -i -n
  • +D:显示指定目录下的所有文件。lsof +D /path/to/directory
  • -c:显示指定进程名称所打开的文件。lsof -c nginx
  • -t:仅输出进程 ID,适用于脚本中自动化处理。lsof -t -i :80
  • -r:定时输出文件列表。-r 后跟时间,单位为秒,表示每隔指定的秒数刷新一次输出。lsof -r 5

常见用途

  1. 查看打开的网络连接
    查看本机所有的网络连接(包括 TCP 和 UDP):lsof -i
  2. 查看某个端口的占用情况
    查看哪些进程占用了 80 端口:lsof -i :80
  3. 查看某个进程打开的文件
    查看进程 ID 为 1234 的进程打开的文件:lsof -p 1234
  4. 查看某个用户打开的文件
    查看用户 username 打开的所有文件:lsof -u username
  5. 查看某个目录下的文件
    查看 /home/user/ 目录下的所有打开文件:lsof +D /home/user/
  6. 查看文件系统中占用的文件
    查看系统中某个特定文件是否被占用:lsof /path/to/file
  7. 查看某个设备的使用情况
    查看 /dev/sda 设备被哪些进程占用:lsof /dev/sda
  8. 列出所有打开的文件和相关进程
    直接列出所有已打开的文件和相关进程信息:lsof

常见输出列解释

COMMAND    PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

  • COMMAND:执行的命令名。
  • PID:进程 ID。
  • USER:进程的所有者。
  • FD:文件描述符(如 cwd:当前工作目录,txt:程序的文本文件)。
  • TYPE:文件类型(如 REG:常规文件,DIR:目录,CHR:字符设备,FIFO:命名管道)。
  • DEVICE:设备编号。
  • SIZE/OFF:文件大小或偏移量。
  • NODE:文件的 inode 号。
  • NAME:文件的名称或路径。

实用示例

  1. 查看哪个进程占用了 80 端口lsof -i :80
  2. 查看指定用户打开的文件lsof -u root
  3. 查看指定进程(如 nginx)打开的文件lsof -c nginx
  4. 查看某个文件是否被占用lsof /path/to/file
  5. 查看所有打开的文件并输出到文件lsof > open_files.txt
  6. 查看所有的网络连接并输出到文件lsof -i > network_connections.txt

总结

lsof 是一个非常强大且常用的 Linux 工具,可以帮助系统管理员和开发人员了解当前系统中哪些文件和资源正在被占用。它不仅支持普通文件,还可以查看设备、网络连接、管道等多种类型的文件。在系统调试、资源管理、进程监控等方面,lsof 都具有很高的实用性。