前面刚介绍过,在linux 世界里,一切皆文件:普通文件、目录、套接字、管道、设备、内存映射文件,全都是文件。而lsof(list open files)就是能看穿进程与所有文件关联的终极透视工具。
大部人只用会用lsof -i:端口查占用,其实这只是它的冰山一角。真正的生产环境中,端口冲突、磁盘空间不释放、文件句柄泄漏、进程阻塞、异常外连、文件误删恢复等头疼问题,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)
记住:排障先看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 秒数 | 循环刷新输出 | 实时监控文件 / 端口占用 |
场景 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




#每2秒刷新,监控80端口连接lsof -i:80 -nP -r 2#实时监控/app目录文件打开情况lsof +D /data -r 2


四、避坑指南:生产环境用 lsof,别踩这些雷
五、终极总结:lsof 实战心法
lsof不是简单的查文件工具,而是linux资源排障的瑞士军刀。掌握这些高级用法,端口占用、磁盘泄漏、进程阻塞、文件锁、异常外连这些生产难题,你都能一分钟定位根源。如果觉得文章有帮助,记得点赞加关注。