Lsof 命令速查指南:使用 Quick Reference 排查进程打开的文件与端口占用

Lsof 命令速查指南:使用 Quick Reference 排查进程打开的文件与端口占用 Lsof 命令速查指南使用 Quick Reference 排查进程打开的文件与端口占用【免费下载链接】reference面向开发者的技术速查清单Cheat Sheets集合整理常见技术、工具与开发流程帮助快速查阅关键信息提高开发效率。项目地址: https://gitcode.com/GitHub_Trending/referen/referencelsofList Open Files是 Linux/Unix 系统管理员与开发者最常用的诊断工具之一用于查询“哪个进程打开了哪些文件”并进一步定位端口占用、文件被锁、连接来源等问题。本文以开源项目 Quick Referencereferen/reference中的 lsof 备忘清单 为核心骨架完整收录其全部命令与参数表并结合项目内其他速查文档展开实操讲解帮助你快速掌握按端口、进程、用户、PID、文件与目录维度筛选的整套用法以及输出结果中 FD、文件状态、锁与文件类型的完整含义。lsof 是什么lsof表示ListOpenFiles即“列出打开的文件”。在 Unix 哲学中“一切皆文件”普通文件、目录、字符设备、块设备、Unix 域套接字、FIFO、网络套接字IPv4/IPv6等都以文件描述符的形式被进程持有。lsof通过访问内核的文件表信息把“文件 ↔ 进程”的对应关系完整呈现出来是排查以下问题的首选工具端口被哪个进程占用如 8080 端口起不来某个配置文件/日志文件正被哪些进程打开某个挂载点或目录无法卸载时是谁在占用某个用户、某个程序打开了多少文件。最基本的用法如下$ lsof # 列出系统当前所有被打开的文件 $ sudo lsof -u root # 列出 root 用户打开的进程文件直接运行lsof会输出大量内容因此实际使用中几乎总是配合筛选参数端口、进程、用户、PID、文件路径等使用这也是本文接下来逐类讲解的重点。说明查看其他用户进程打开的文件、以及完整的网络连接信息通常需要 root 权限因此示例中常出现sudo lsof ...。特定于端口定位端口占用网络套接字也属于“打开的文件”所以lsof -i系列成为排查端口占用最常用的命令。-i后面可以组合协议、端口、端口段和 IP 地址。$ lsof -i :8080 # 查看 8080 端口被哪些进程占用 $ lsof -i :80 -i :22 # 同时查看 80 和 22 两个端口 $ lsof -i TCP:22 # 仅查看 TCP 协议的 22 端口 $ lsof -i TCP:1-1024 # 查看 TCP 协议的 1-1024 端口段 $ lsof -i UDP # 查看所有 UDP 网络连接 $ lsof -i 192.168.1.5 # 查看与指定 IP 地址相关的连接-i的完整语法为[46][protocol][hostname|hostaddr][:service|port|port-range]各段均可省略4/6限定 IPv4 / IPv6protocol限定为TCP或UDPhost限定远端或本地主机地址:port/:port1-port2限定端口或端口范围。例如“8080 端口被占用”的经典排查流程是$ sudo lsof -i :8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 2345 root 30u IPv6 123456 0t0 TCP *:8080 (LISTEN)从输出可以立刻看出是java进程PID 2345在监听 8080 端口。特定于进程按命令名筛选使用-c 进程名可以列出指定命令可执行文件名称所打开的文件注意它匹配的是进程命令名的开头字符$ lsof -c mysql # 列出 mysql 进程打开的文件 $ lsof -c java $ lsof -c ssh $ lsof -c nginx $ lsof -c ssh -c httpd # 同时匹配 ssh 与 httpd 两类进程-c支持多个参数同时指定多个命令名适合一次排查一组相关服务。例如查看 nginx 打开的配置文件、日志文件与套接字可以快速确认其运行状态与资源占用。特定于用户按用户筛选使用-u 用户名列出指定用户打开的所有文件多个用户可用多个-u并列在用户名前加^表示排除该用户。$ lsof -u www-data # 列出 www-data 用户打开的进程文件 $ lsof -u www-data -u ubuntu # 同时列出 www-data 与 ubuntu 两个用户 $ lsof -i -u ^root # 查看网络连接中除了 root 用户以外的^前缀同样适用于-pPID等参数实现“排除法”筛选这在想过滤掉系统自身进程时非常实用。特定于网络仅 IPv4 / IPv6-i后直接跟数字可以限定协议族$ lsof -i 4 # 仅显示 IPv4 网络连接 $ lsof -i 6 # 仅显示 IPv6 网络连接当机器同时存在 IPv4 与 IPv6 栈、且同端口有两个监听条目时用这两个参数可以快速区分是 v4 还是 v6 的套接字。特定的 PID按进程号筛选使用-p PID列出指定进程号所打开的所有文件加^排除某些 PID$ lsof -p 1753 # 列出 PID 为 1753 的进程打开的文件 $ lsof -p ^3 # 列出除 PID 3 之外的所有进程打开的文件lsof -p $pid常被写成脚本变量形式便于在自动化脚本中动态传入进程号lsof -p $pid当排查“某个进程为何卡住、为何无法退出、打开过多文件”时lsof -p pid是查看其文件描述符明细最直接的途径。特定文件名与目录直接以文件路径作为参数即可列出打开该文件的进程$ lsof /var/log/messages # 谁在打开这个日志文件 $ lsof /etc/passwd当umount提示“设备正忙”时用lsof 挂载点路径就能找出占用者。目录的筛选分为递归与非递归两种$ lsof D /var/log # 递归列出 /var/log 目录内被打开的所有文件 $ lsof d /var/log # 仅列出该目录下不递归被打开的文件D会递归遍历整个目录树适合搜索日志目录、临时目录中的占用文件d只查单层目录速度更快。组合筛选与排除lsof的多个条件默认是“或”的关系例如lsof -c ssh -c httpd会同时列出两类进程。如果需要“且”的关系同时满足多个条件要加上-a参数$ lsof -a -u www-data -i :80 # www-data 用户且占用 80 端口 $ lsof -a -p 2345 -i TCP # PID 2345 且为 TCP 连接^前缀用于排除指定值例如前面提到的-u ^root、-p ^3。掌握“-a做交集、^做排除”这两个技巧就能组合出精确的筛选条件。参数速查表原文档docs/lsof.md整理的常用参数汇总如下| 参数 | 说明 | | :- | :- | |-a| 多个条件取“与”AND关系列出同时满足条件的进程 | |-c进程名| 列出指定进程命令名所打开的文件 | |-g| 列出 GID 号进程详情 | |-d文件号| 列出占用该文件号的进程 | |d目录| 列出目录下被打开的文件不递归 | |D目录| 递归列出目录下被打开的文件 | |-n目录| 列出使用 NFS 的文件 | |-i条件| 列出符合条件的进程协议、:端口、ip | |-p进程号| 列出指定进程号所打开的文件 | |-u| 列出 UID 号进程详情 | |-h| 显示帮助信息 | |-v| 显示版本信息 |配合上面场景化示例这张表可以作为日常查询的手边速查卡看到“端口”想到-i看到“进程名”想到-c看到“用户”想到-u看到“PID”想到-p看到“文件/目录”则直接传路径或用d/D。实战获取 PID、精准杀掉占用进程-t参数让 lsof 只输出进程号terse 模式配合kill可以一键清理占用端口的进程$ kill -9 lsof -t -u apache # 杀掉 apache 用户的所有进程反引号 $ kill -9 $(lsof -t -i :8080) # 杀掉占用 8080 端口的进程命令替换两种写法等价$(...)更推荐因为可读性好且支持嵌套。先-t拿到 PID再决定是否kill也避免了误杀$ lsof -t -i :8080 # 只输出占用 8080 端口的 PID便于脚本处理原文档还提供了一个“获取端口对应的进程 ID”的经典写法lsof -i:9981 -P -t -sTCP:LISTEN-i:9981筛选 9981 端口-P端口号不做名称转换直接显示数字而非服务名-t只输出 PID-sTCP:LISTEN仅筛选 TCP 且状态为LISTEN的套接字。这组参数组合在部署脚本中极为常用——例如启动前检查端口是否已被监听或拿到旧进程 PID 后做优雅重启。输出结果解读直接运行lsof的输出形如$ lsof command PID USER FD type DEVICE SIZE NODE NAME init 1 root cwd DIR 8,2 4096 2 / init 1 root rtd DIR 8,2 4096 2 / init 1 root txt REG 8,2 43496 6121706 /sbin/init init 1 root mem REG 8,2 143600 7823908 /lib64/ld-2.5.so init 1 root mem REG 8,2 1722304 7823915 /lib64/libc-2.5.so init 1 root mem REG 8,2 23360 7823919 /lib64/libdl-2.5.so init 1 root mem REG 8,2 95464 7824116 /lib64/libselinux.so.1 init 1 root mem REG 8,2 247496 7823947 /lib64/libsepol.so.1 init 1 root 10u FIFO 0,17 1233 /dev/initctl migration 2 root cwd DIR 8,2 4096 2 / migration 2 root rtd DIR 8,2 4096 2 / migration 2 root txt unknown /proc/2/exe可以看到initPID 1进程除了当前工作目录cwd、根目录rtd之外还加载了/sbin/init可执行文件、多个共享库mem内存映射文件、以及/dev/initctl这个 FIFO 文件文件描述符10u。列信息说明| 列 | 说明 | | :- | :- | |COMMAND| 进程的名称 | |PID| 进程标识符 | |PPID| 父进程标识符需要指定-R参数 | |USER| 进程所有者 | |PGID| 进程所属组 | |FD| 文件描述符应用程序通过它识别该文件 |原文档docs/lsof.md特别提示PPID列只有在加了-R参数时才会显示。文件描述符FD类型FD列的第一部分是文件描述符名称/编号常见取值如下| FD | 含义 | | :- | :- | |cwd| 当前工作目录即应用程序启动时的目录除非它自行更改 | |txt| 程序代码文件如应用程序二进制本身或共享库如示例中的 /sbin/init | |lnn| 库引用AIX | |er| FD 信息错误参见名称列 | |jld| jail 目录FreeBSD | |ltx| 共享库文本代码和数据 | |mxx| 十六进制内存映射类型编号 xx | |m86| DOS 合并映射文件 | |mem| 内存映射文件 | |mmap| 内存映射设备 | |pd| 父目录 | |rtd| 根目录 | |tr| 内核跟踪文件OpenBSD | |v86| VP/ix 映射文件 | |0| 标准输入stdin | |1| 标准输出stdout | |2| 标准错误stderr |说明0、1、2分别对应标准输入、标准输出、标准错误这是 POSIX 的标准约定例如示例中的10u表示文件描述符编号 10、以读写模式打开。文件状态模式FD 第二部分在文件描述符名称/编号之后通常还跟着文件状态模式字符| 模式 | 含义 | | :- | :- | |u| 该文件被打开并处于读取/写入模式 | |r| 该文件被打开并处于只读模式 | |w| 该文件被打开并处于写入模式 | |空格| 状态模式未知unknown且没有锁定 | |-| 状态模式未知unknown且被锁定 |例如示例中的10u中u就表示该 FIFO 以读写模式打开。文件锁FD 第三部分在文件状态模式后面还可能跟着相关的锁字符| 锁 | 含义 | | :- | :- | |N| 对于未知类型的 Solaris NFS 锁 | |r| 用于部分文件的读取锁定 | |R| 对整个文件进行读取锁定 | |w| 对文件的一部分进行写锁定文件的部分写锁 | |W| 对整个文件进行写锁定整个文件的写锁 | |u| 用于任何长度的读写锁 | |U| 对于未知类型的锁 | |x| 对于文件部分的 SCO OpenServer Xenix 锁 | |X| 对于整个文件的 SCO OpenServer Xenix 锁 | |空格| 如果没有锁 |文件类型TYPE 列TYPE列标识文件类型| 标识 | 说明 | | :- | :- | |DIR| 表示目录 | |CHR| 表示字符类型设备 | |BLK| 块设备类型 | |UNIX| UNIX 域套接字 | |FIFO| 先进先出FIFO队列 | |IPv4| 网际协议IP套接字 | |REG| 常规文件 |其余列的含义DEVICE指定磁盘的名称设备号SIZE为文件的大小NODE为索引节点文件在磁盘上的标识NAME为打开文件的确切名称。理解了这些字段就能从一行lsof输出中读出“哪个进程、以什么模式、打开了哪种类型的文件”。在项目中的延伸与其他速查命令配合在本项目 Quick Reference 的“命令”分类中lsof 备忘清单 与 netstat 备忘清单、htop 备忘清单、ps 备忘清单 等共同构成了一套进程与网络排查组合拳端口/连接概览用netstatdocs/netstat.md 中提供了netstat -ltunp所有监听端口、netstat -anp | grep :80端口 80 的所有连接、以及netstat -tn 2/dev/null | grep :80 | awk ...统计连接数等命令实时交互式查看用htopdocs/htop.md 中记录了在 htop 界面按l键即可显示进程打开的文件——该功能正是依赖lsof(1)实现的文档原文注明“如果安装了 lsof(1)按下该键将显示进程打开的文件描述符列表”通用命令索引见 docs/linux-command.md其中第 113 行将lsof归类为“列出进程打开的文件”与其他系统/网络排查命令一起作为总入口。典型排查路径先用netstat -ltunp或lsof -i :8080找到端口占用进程再用lsof -p pid深入查看该进程打开的所有文件必要时用lsof -t -i :8080取出 PID 执行kill全程不需要安装任何额外工具。小结lsof的核心价值在于把“文件 ↔ 进程”的双向关系讲清楚按端口-i、进程-c、用户-u、PID-p、文件与目录路径、d、D五个维度都能筛选配合-t输出 PID、-a取交集、^做排除即可应对绝大多数日常运维与开发排障场景。本文的所有命令与参数表均整理自 docs/lsof.md你可以直接复制使用也可以回到该备忘清单查阅原始速查格式。【免费下载链接】reference面向开发者的技术速查清单Cheat Sheets集合整理常见技术、工具与开发流程帮助快速查阅关键信息提高开发效率。项目地址: https://gitcode.com/GitHub_Trending/referen/reference创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考