当前位置:首页>Linux>Linux 运维实战:lsof高级用法,搞定端口占用、文件泄漏、磁盘满等90%故障

Linux 运维实战:lsof高级用法,搞定端口占用、文件泄漏、磁盘满等90%故障

  • 2026-10-11 07:56:05
Linux 运维实战:lsof高级用法,搞定端口占用、文件泄漏、磁盘满等90%故障

前面刚介绍过,在linux 世界里,一切皆文件:普通文件、目录、套接字、管道、设备、内存映射文件,全都是文件。而lsof(list open files)就是能看穿进程与所有文件关联的终极透视工具。

大部人只用会用lsof -i:端口查占用,其实这只是它的冰山一角。真正的生产环境中,端口冲突、磁盘空间不释放、文件句柄泄漏、进程阻塞、异常外连、文件误删恢复等头疼问题,lsof的高级用法能一键定位根源。

本文聚焦lsof实战高级用法,从输出解读到场景排障,全是干货。

一、lsof 输出核心字段
执行lsof后输出看似杂乱,关键字段吃透,排障直接抓重点:
COMMAND  PID USER   FD      TYPE DEVICE SIZE/OFF       NODE NAMEnginx    1234 root  cwd      DIR  253,0     4096   1310721 /usr/local/nginxjava     5678 app   3w       REG  253,1  10485760   2621440 /opt/app.log (deleted)python   9012 dev   10u     IPv4  19876      0t0       TCP *:8080 (LISTEN)
  • command:进程名
  • pid:进程id(排障核心)
  • user:进程所属用户
  • fd:文件描述符(排障黄金字段)
  • cwd:进程当前工作目录
  • txt:程序二进制 / 库文件
  • mem:内存映射文件
  • 数字+r/w/u:r = 读、w = 写、u = 读写,数字为文件句柄编号
  • (deleted):文件已删除但进程仍占用(磁盘满元凶)
  • type:文件类型(reg = 普通文件、dir = 目录、IPv4/IPv6 = 网络套接字)
  • name:文件路径 / 网络连接信息

记住:排障先看fd和type,90% 问题直接定位。

二、lsof核心参数

生产环境禁止直接跑lsof(耗资源和io),用高级参数靶向查询,这才是资深运维的用法:

高级参数

作用

实战场景

-nP

不解析域名、不解析端口名(速度提升 10 倍)

网络连接快速排查

-a

多条件逻辑与(默认是或)

精准过滤用户+端口+进程

-c

按进程名过滤(支持模糊匹配)

查所有 java/nginx 进程打开的文件

-d

按文件描述符过滤

定位句柄泄漏

-t

仅输出pid

一键kill占用进程

+L1

查找已删除未释放文件(比 grep deleted 高效)

磁盘空间不释放排查

-s tcp:状态

按tcp状态过滤

只看listen/established连接

-r 秒数

循环刷新输出

实时监控文件 / 端口占用

三、losf的八大高级实战场景

场景 1:端口占用深度排查

普通用法:lsof -i:8080

高级用法:只看监听状态、屏蔽解析、精准定位

#查看8080端口监听进程(无冗余输出)lsof -i TCP:8080 -s TCP:LISTEN -nP#查看8080端口所有已建立连接(定位并发过高)lsof -i TCP:8080 -s TCP:ESTABLISHED -nP#一键kill占用端口的进程(慎用!)lsof -ti:8080 | xargs kill -9

场景 2:磁盘空间满,但 du 查不到大文件(已删除文件占用)

现象:df显示磁盘 100%,du找不到大文件,文件被删但进程未释放。

高级用法:直接定位泄漏进程,+L1 是查找链接计数为1的已删除文件。


#高效查找所有已删除未释放文件(+L1比grep快)lsof +L1 -nP#按进程统计已删除文件大小(定位元凶)lsof +L1 -nP | awk '{sum[$1"("$2")"]+=$7} END {for(p in sum) print p, sum[p]/1024/1024"MB"}'#临时释放空间(不重启进程),pid和fd根据上面的命令可以获取,生产环境比较实用 cat /dev/null > /proc/PID/fd/FD编号

场景 3:文件 / 目录被占用,无法删除 / 卸载

现象:rm提示device or resource busy、umount 提示target is busy

高级用法:递归查目录占用、定位锁文件

#查单个文件被哪个进程占用lsof /opt/app.log#递归查整个目录所有占用(卸载磁盘必备),下图展示因为当前目录在/data里,所以占用 lsof +D /data#查被锁定的文件(W=写锁)lsof /data | grep W

场景 4:进程文件句柄泄漏(Too many open files)

现象:服务报错打开文件数过多,进程崩溃

高级用法:监控句柄增长、定位泄漏文件

#查看指定进程打开的所有文件(过滤无用输出),以docker进程为例 lsof -p 6866 -nP | grep -E "REG|IPv4"#实时监控进程句柄数(增长过快=泄漏)watch -n 1 'lsof -p 6866 | wc -l'#按用户统计打开文件数Top5lsof -nP | awk '{print $3}' | sort | uniq -c | sort -nr | head -5

场景 5:网络连接审计(定位异常外连、挖矿、后门)

高级用法:过滤本地回环、只看外连、定位恶意进程

#查看所有非本机外连(定位异常访问)lsof -i -nP | grep -v "127.0.0.1" | grep ESTABLISHED#查看指定IP的所有连接(安全审计)lsof -i @192.168.2.106 -nP#查root用户所有网络连接(排查特权进程异常)lsof -u root -i -nP

场景 6:多条件组合精准过滤(逻辑与高级用法)

默认lsof多参数是或关系,用-a实现且,精准锁定:

#查app用户的java进程,且占用8080端口的连接lsof -a -u root -c nginx -i:8080 -nP#查nginx进程,且打开的已删除文件lsof -a -c nginx +L1 -nP

场景 7:误删文件恢复(仅限进程仍占用的文件)

前提:文件被 rm,但进程还在打开(未退出)

高级用法:通过 /proc 恢复,无需数据盘

#1.找到被删文件的PID和FDlsof | grep "误删文件名"#2.从文件描述符复制恢复cp /proc/PID/fd/FD编号 /恢复路径/文件名cp /proc/7971/fd/3 /var/log/  #备注:文件名变为3了 ,然后检查确认后mv会以前的文件名就好le 
我另外一个终端将实时查看的文件删除
这是linux运维最高频、最救命的技能之一,只要进程还活着 → lsof 找pid+fd → cp /proc/pid/fd/fd → 恢复完成。注意不要重启进程,恢复后确认无误后在重启进程,文件名会变。
场景 8:实时监控文件 / 端口变化
#每2秒刷新,监控80端口连接lsof -i:80 -nP -r 2#实时监控/app目录文件打开情况lsof +D /data -r 2

四、避坑指南:生产环境用 lsof,别踩这些雷

  1. 禁止直接跑lsof:无参数会扫描全系统,高负载下引发io风暴
  1. 必须加- nP:网络排查不佳,解析域名会卡死、输出慢
  1. 普通用户权限不足:查系统进程、端口必须具有root权限
  1. 容器内排查要进容器:宿主机lsof看不到容器内进程
  1. kill占用进程谨慎:生产环境优先重启服务,不直接kill

五、终极总结:lsof 实战心法

  1. 查端口:lsof -i:端口 -s tcp:状态 -nP
  1. 查磁盘满:lsof +L1
  1. 查文件占用:lsof +D目录
  1. 查句柄泄漏:lsof -p pid
  1. 查异常连接:lsof -i -nP | grep 外连ip
  1. 脚本化:lsof -t 条件 | xargs kill

lsof不是简单的查文件工具,而是linux资源排障的瑞士军刀。掌握这些高级用法,端口占用、磁盘泄漏、进程阻塞、文件锁、异常外连这些生产难题,你都能一分钟定位根源。如果觉得文章有帮助,记得点赞加关注。

lsof:系统运维的利刃——常用操作全解析

#运维#linux运维#lsof的高级用法

最新文章

随机文章