尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

lsof命令详解:从端口查到文件占用,Linux运维必会排查神器

发布时间:2026/9/24 19:21:41

资讯中心
01
ARTICLE

lsof命令详解:从端口查到文件占用,Linux运维必会排查神器

lsof命令详解:从端口查到文件占用,Linux运维必会排查神器
1. lsof是什么运维排查为什么离不开它搞 Linux 运维的人迟早会遇到这么个场景明明端口已经释放了服务却起不来明明删掉了一个大文件磁盘空间却一点没变明明进程还活着日志却写不进去了。这一串问题的答案大多都藏在同一条命令里——lsof。lsof 的全称是 List Open Files也就是列出当前系统上被进程打开的所有文件。它工作在 CentOS 7.6 这类 Linux 系统上时能告诉你哪个进程占用了哪个端口、哪个进程打开了哪个文件、某个文件被谁锁定甚至还能帮你恢复已经被删除但尚未释放的文件。对运维、开发、DevOps 工程师来说lsof 跟ps、netstat、ss这些命令一样属于排查基本功里最值得先吃透的一个。这篇文章适合几类人刚接触 Linux 命令的新手想搞明白“为什么 netstat 查不到的东西 lsof 能查到”写代码时遇到端口冲突、文件被占用的开发以及日常要处理线上故障、需要快速定位问题的运维。我会从原理讲到字段再拆高频用法和实战排查最后把那些手册里不会明说的坑一次性讲完。2. 先搞懂原理和安装后面才不迷糊2.1 lsof 为什么能查出“谁占用了文件”Linux 系统里有一个很基础也很核心的设计一切皆文件。普通文件是文件目录是文件设备是文件网络连接套接字也被抽象成文件描述符。当一个进程打开一个文件时内核会为它分配一个文件描述符FD同时在/proc文件系统下记录这个进程的资源使用情况。lsof 并不是自己在背后做监控它的数据来源其实是从内核的/proc目录里读取的。它遍历系统中所有进程的/proc/pid/fd目录把每个文件描述符指向的真实文件、套接字、管道等信息解析出来然后以列表形式呈现。这也是它能查得比 netstat 更细的原因netstat 主要解析内核的网络连接表而 lsof 直接面对的是每个进程的文件描述符全集。明白了这一点你就能理解为什么 lsof 的适用范围那么广。它查的不只是网络端口还有普通文件、共享库、当前工作目录、内存映射文件、管道、socket、设备文件等。任何占据资源的句柄在 lsof 眼里都是一条记录。2.2 CentOS 7.6 上的安装方式CentOS 7.6 默认最小化安装时lsof 往往是不存在的。我第一次在一台刚交付的 7.6 服务器上执行lsof直接提示command not found当时还愣了几秒。后面装了才想起来这个命令属于lsof包最小化安装不会自带。安装很简单用 yum 直接装yum install -y lsof如果你的机器配置了阿里云、网易或者其他国内源速度一般都没问题。装完验证一下lsof -v执行后能看到版本信息说明安装成功。还有一个小细节某些容器镜像里可能连yum都不齐全那种场景下你可以用宿主机上的 lsof或者通过nsenter进入容器网络命名空间排查但这个属于进阶用法后面单独讲。3. 读懂 lsof 的输出比记住参数更重要3.1 输出字段逐列拆解执行一条最基础的命令lsof输出会很长但格式是统一的每一行代表一个被打开的文件。常见列有COMMAND进程的命令名比如nginx、java、sshd。PID进程 ID唯一的数字标识。TID线程 ID一般显示为空多线程程序里能看到具体是哪个线程打开了文件。USER进程所属用户。FD文件描述符表示这个文件是怎么被打开的。TYPE文件类型可能是常规文件、目录、IPv4 套接字等。DEVICE设备号表示文件所在设备。SIZE/OFF文件大小或者当前偏移量。NODEinode 编号唯一标识一个文件系统对象。NAME文件路径或者连接的具体地址。大多数时候你关注的是 PID、USER、FD、TYPE、NAME 这几列。比如你看到一个 java 进程占着端口 8080用 lsof 一查NAME列会直接显示*:8080 (LISTEN)一眼就知道是谁在监听的。3.2 FD 和 TYPE 列怎么读FD 列的常见取值有cwd当前工作目录、txt程序文本文件即可执行文件、mem内存映射文件、r只读打开、w只写打开、u可读写打开、数字比如1u、2w表示文件描述符编号及打开模式。TYPE 列更值得注意。普通文件是REG目录是DIR字符设备是CHRIPv4 和 IPv6 套接字分别对应IPv4、IPv6。你还会经常看到unix类型的 UNIX 域套接字以及a_inode、unknown这类不常见取值。看到unknown别慌它通常表示内核文件系统或者某些特殊文件这类记录不一定是问题。我见过不少初学者对着lsof | grep unknown的输出半天不敢动其实完全没必要。3.3 为什么同一进程会输出好几行很多人在第一次执行lsof -p pid时都惊讶一个进程怎么打开了这么多文件原因很简单任何一个运行中的程序都会加载可执行文件、动态链接库、配置文件、日志文件同时还要打开/dev/null、/dev/urandom、当前目录、标准输入输出等。尤其是 Java、Python 这类应用会把 JAR 包、so 库、socket 全部算进来。这不是异常是常态。你需要做的是先揪出几个默认记录熟悉它们长什么样再去排查异常项就会顺手很多。4. 高频用法从查端口到查文件的完整命令手册4.1 按端口查进程解决“端口被占”老大难这是日常使用最频繁的方向。比如启动服务时提示端口 8080 已被占用lsof -i :8080输出会直接列出 PID、进程名和安全连接信息。如果只想看处于监听状态的lsof -i :8080 -sTCP:LISTEN如果想查所有 TCP 端口而不限定具体编号lsof -i tcp要查 UDPlsof -i udp这个用法在 CentOS 7.6 上稳定好用而且比netstat -tunlp | grep 8080多给了一层信息它直接显示进程名同时也能查出netstat经常隐藏掉的进程所属用户。排查完想要结束占用进程就用kill -9 pid但动手前一定要确认 PID 是对的避免误杀系统关键进程。4.2 按文件或目录查“谁在用”日志文件被占用、配置文件删不掉、目录卸载提示 busy这些场景都用得上lsof /var/log/messages查目录也是同样的语法。比如你要卸载/data分区结果提示设备忙lsof /data它能直接告诉你/data下面哪个文件正被哪个进程开着。再配合fuser -mv /data也能达到类似效果但显示风格不同。我习惯先用 lsof 看清路径和进程再做决策信息全一些。4.3 按进程查它打开了什么查具体进程的所有打开文件lsof -p 12345如果你需要列出这个进程相关的网络连接lsof -p 12345 -i如果只想看普通文件、不想看到 socket 和管道lsof -p 12345 -a -d ^cwd,^txt,^mem这里-a表示参数之间是“与”的关系^表示排除。这个组合适合排查进程卡死是不是因为打开的文件句柄过多。你数一下行数就知道 FD 数量再对比系统的ulimit -n限制基本上能判断是否触发了句柄上限。4.4 按用户或命令名过滤有时候你要查某个用户下所有进程占用了哪些文件lsof -u nginx加上-i只查网络部分lsof -u nginx -i按命令名过滤也一样简单lsof -c java这里有个小坑-c匹配的是命令名的开头不是全词匹配所以-c java可能匹配到javac之类的进程。如果需要精确匹配建议先ps -ef | grep java拿到 PID 再用-p查。4.5 查看已经建立的网络连接及状态想看当前系统所有对外连接lsof -i想只看 ESTABLISHED 状态的连接lsof -i -sTCP:ESTABLISHED想查某个远程 IP 是否有连接lsof -i 192.168.1.100想查某个远程 IP 加端口的组合lsof -i 192.168.1.100:3306这组命令在排查“为什么本机和数据库之间连接数居高不下”“哪个进程在频繁连外网”时特别管用。5. 三个实战场景完整走一遍排查思路5.1 场景一服务启动失败报端口被占用某次我部署一个 Spring Boot 应用启动日志半天没动静最后抛了个BindException: Address already in use。这种问题大多数人第一反应是查端口lsof -i :8080结果拉出来java 2103 root 47u IPv6 456789 0t0 TCP *:8080 (LISTEN)说明 8080 被 PID 2103 的 java 进程占了。这个 java 不是我要启动的应用而是之前跑批任务残留的进程因为 nobody 用户启动命令名也叫 java肉眼很难分辨。这时候看lsof -p 2103的输出确认启动参数里带了旧的 jar 包路径就能确定是残留进程。直接 kill 掉再重启服务kill -9 2103这里给个建议线上环境优先用kill确认进程无法正常退出再考虑kill -9。很多任务进程会持有数据缓冲强杀可能导致数据不一致。5.2 场景二磁盘空间显示不足但du查不出大文件有次监控告警某台服务器/var分区使用率超过 95%。我登录上去执行df -h确实看到/var满了。但我去/var/log下用du -sh *逐个目录统计总大小远远小于分区占用。问题在于某个进程还握着已删除文件。只要进程不关闭这个句柄磁盘空间就不会真正释放而du从目录层面统计不到这些“消失的文件”。处理方式lsof L1这个组合的关键是L1只列出 link count 小于 1 的文件也就是已经被删除、但仍被进程占用的文件。输出里能看到类似java 3104 root 4w REG 253,0 8388608 1001 /var/log/app.log (deleted)确定没问题后重启对应进程或者 kill 掉它。空间立刻就回来了。这个场景是我认为 lsof 最有价值的地方。df和du对不上时别急着翻堆日志先lsof L1看一眼绝大多数情况能一秒钟定位。5.3 场景三文件无法删除提示“Device or resource busy”你要删一个临时目录结果报Device or resource busy。这通常意味着某个进程把这里当成了工作目录或者正在使用其中的文件。lsof /data/tmpdir输出会显示哪个 PID 正在占用。看了之后你会有两个选择杀掉进程或者让进程切换目录后再次尝试卸载/删除。如果你只是想临时绕过可以使用mount --bind等方式把目录挪走但这属于绕路技巧不推荐在没确认进程归属时操作。还有个相关点如果 busy 的是整个分区比如 umount 时提示 target is busy用lsof D /mnt/dataD会递归扫描目录树比直接lsof /mnt/data多查一层子目录里被打开的文件。这个选项在目录层级很深时稍微慢一些但结果更全面。6. 高频选项速查表与常见坑6.1 速查表用途命令说明查端口占用lsof -i :8080按端口查监听或连接只看监听lsof -i :8080 -sTCP:LISTEN过滤监听状态查所有 TCPlsof -i tcp所有 TCP 连接按用户查lsof -u app指定用户的所有打开文件按进程查lsof -p 1234指定 PID按命令查lsof -c java命令名开头匹配查文件占用lsof /var/log/a.log指定文件查目录占用lsof D /opt/app递归目录查已删除占用lsof L1link count 小于 1查远程连接lsof -i 10.0.0.1指定远程 IP排除目录lsof -p 1 -d ^cwd,^txt,^mem排除特定 FD 类型6.2 常见问题与排查技巧实录第一个常见误区是“lsof 查不到端口但 bind 仍然失败”。这种情况多半是服务监听的协议类型不同比如一个进程监听在 IPv6用lsof -i :80默认能覆盖但如果你只记住“IPv4 查 IPv6 查不到”的老经验一上来就用lsof -i4 :80就会漏。所以我在不确定协议栈时就用不带-4/-6的写法让它同时匹配。第二个坑是-i后面同时跟 IP 和端口时容易写错。正确的写法是lsof -i192.168.1.1:80中间不要加空格。我见过有人写成lsof -i 192.168.1.1 : 80导致解析失败报错信息又不是很直观容易卡住。第三个问题更常见线上权限不够。lsof 默认只显示当前用户有权限查看的进程信息普通用户执行lsof时看到的内容比 root 少得多。排查系统级问题时记得用sudo lsof否则容易漏判。这里有个细节sudo lsof -p your_pid如果连自己的进程都显示不全多半是/proc权限受限比如容器环境需要宿主机配合。还有一个经验lsof -i的输出里如果出现大量CLOSE_WAIT状态的连接说明程序有 socket 没正常关闭这通常是应用层 bug不是 lsof 的问题。这时候用lsof -i -sTCP:CLOSE_WAIT | wc -l统计数量再按进程聚合lsof -i -sTCP:CLOSE_WAIT | awk {print $1, $2} | sort | uniq -c | sort -rn马上能看出是哪个进程在泄露连接。这招我在排查 Java 服务连接池泄漏时用过很多次比一个个翻 netstat 高效得多。6.3 最后一个想分享的小习惯踩过几次坑之后我现在排查顺序基本固定了先用ss -tlnp快速看端口再用lsof -i :端口确认进程细节遇到资源占用就上lsof L1查 delete 状态。lsof 不一定是首条命令但一定是把问题彻底定位清楚的收尾命令。如果你刚接触 CentOS 7.6建议在测试机上多试几组组合尤其是-i、-p、-u和L1这几个高频用法。敲到肌肉记忆之后线上出问题时你就能少一些慌张多一分笃定。毕竟排查工具这东西熟不熟关键时候见真章。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。