
lsof 命令实战3个网络连接排查场景与10个关键参数组合在Linux系统运维中网络连接问题排查是每个工程师的必修课。当服务无法启动、端口冲突或出现异常连接时lsoflist open files命令往往能成为你的救火队长。不同于基础教程中简单的参数罗列本文将聚焦三个真实运维场景通过参数组合拳解决实际问题并附赠一张高频参数速查表。1. 端口占用冲突服务启动失败的快速定位上周处理线上告警时遇到一个典型场景某微服务启动时报错Address already in use但通过netstat却找不到明显的进程占用。此时lsof的精准过滤能力就派上了用场。1.1 组合参数精准定位# 查看所有监听8080端口的进程包含隐藏进程 sudo lsof -i :8080 -sTCP:LISTEN -P -n参数解析-i :8080限定检查8080端口-sTCP:LISTEN只显示处于监听状态的TCP连接-P禁止端口到服务名的转换显示真实端口号-n禁止IP到域名的转换加速查询1.2 实战案例解析某次排查中发现如下输出COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 28765 app 12u IPv6 493102 0t0 TCP *:8080 (LISTEN) docker-pr 1234 root 4u IPv4 123456 0t0 TCP 127.0.0.1:8080 (LISTEN)问题诊断两个进程同时监听8080端口Docker代理进程绑定了127.0.0.1而Java进程绑定*所有接口由于Docker代理先启动导致Java服务绑定失败解决方案# 先确认Docker容器是否需要该端口 docker ps --format table {{.ID}}\t{{.Names}}\t{{.Ports}} | grep 8080 # 若确认可停止则结束Docker代理进程 sudo kill -TERM 12341.3 进阶技巧检测端口复用Linux支持SO_REUSEPORT选项可能导致多个进程共享端口。检测方法sudo lsof -i :8080 -P -n -T qs输出中的SO_REUSEPORT标记会显示端口共享状态。2. 异常网络连接安全排查实战安全巡检时发现服务器存在异常外连行为。传统的netstat无法显示进程详细信息而lsof可以关联进程和连接。2.1 可疑连接检测组合# 查看所有ESTABLISHED状态的IPv4连接排除本地流量 sudo lsof -i4 -a -sTCP:ESTABLISHED -nP | grep -vE 127.0.0.1|192.168.关键参数-i4仅IPv4连接-aAND逻辑组合条件-sTCP:ESTABLISHED已建立的TCP连接grep -vE排除内网地址2.2 实战案例挖矿程序检测某次输出中发现异常进程node 14567 nobody 3u IPv4 112233 0t0 TCP 10.0.0.1:3333-45.67.89.1:6666 (ESTABLISHED)排查步骤检查进程路径ls -l /proc/14567/exe查看进程树pstree -aps 14567捕获网络流量sudo tcpdump -i eth0 -w /tmp/suspect.pcap host 45.67.89.12.3 连接状态深度解析lsof能识别多种TCP状态对排查特别有用状态缩写完整状态典型场景LISTENLISTENING服务监听端口ESTABESTABLISHED活跃连接CLOSE_WAITCLOSE_WAIT对方关闭连接本地未关闭TIME_WAITTIME_WAIT连接正在关闭检查异常状态的命令sudo lsof -i -sTCP:CLOSE_WAIT,TIME_WAIT -nP3. 服务无法监听文件描述符泄漏排查某Java应用频繁崩溃日志显示Too many open files。这是典型文件描述符泄漏场景需要lsof进行深度分析。3.1 泄漏检测组合命令# 查看指定进程打开的所有文件按类型统计 sudo lsof -p 28765 -a -d ^mem | awk {print $5} | sort | uniq -c | sort -nr输出示例342 FIFO 128 REG 15 IPv4 3 DIR诊断依据大量FIFO管道文件可能是线程通信异常未关闭的REG普通文件需要检查代码逻辑3.2 文件描述符恢复技巧当发现文件被删除但仍被进程占用时常见于日志文件轮转# 查找被删除但仍打开的文件 sudo lsof L1 | grep deleted # 恢复文件内容以PID 28765和FD 12为例 sudo cp /proc/28765/fd/12 /tmp/recovered.log3.3 资源限制检查# 查看当前限制 cat /proc/28765/limits | grep open files # 临时修改限制需root prlimit --pid 28765 --nofile8192:81924. 高频参数速查表根据多年运维经验整理的10个最实用参数组合场景命令组合输出重点端口占用排查lsof -i :端口 -sTCP:LISTEN -nP监听进程的PID和命令异常外连检测lsof -i4 -a -sTCP:ESTABLISHED -nP远程IP和端口用户文件操作监控lsof -u 用户名 -a -d 0-2标准输入输出关联文件进程文件占用分析lsof -p PID -a -d ^mem非内存映射文件网络连接统计lsof -i -nP -F c| grep ^c | sort | uniq -c各命令的网络连接数目录文件访问监控lsof D /path/to/dir -a -u rootroot用户访问的文件文件恢复lsof /path/file | grep deleted文件在进程中的FD号网络服务关联分析lsof -i -nP -F pcn| awk /^p/ {pid$1} /^c/ {cmd$1} /^n/ {print pid,cmd,$0}进程与连接的映射关系文件描述符泄漏lsof -p PID | awk {print $4} | grep -oE [0-9]u? | sort -n检查FD编号是否连续定时监控watch -n 5 lsof -p PID | wc -l文件打开数变化趋势5. 性能优化与注意事项虽然lsof功能强大但在生产环境中使用时需要注意资源消耗# 使用-t参数只获取PID减少解析开销 sudo lsof -t -i :8080 | xargs kill -9替代方案快速检查端口ss -tulnp文件占用检查fuser -v /path/to/file缓存问题# 强制绕过缓存获取最新结果 sudo lsof -b -i :8080容器环境适配# 查看Docker容器的网络连接 nsenter -t $(docker inspect -f {{.State.Pid}} 容器ID) -n lsof -i记住lsof的威力在于参数组合。建议将常用组合保存为别名alias portchecklsof -i :$1 -sTCP:LISTEN -nP alias fdleaklsof -p $1 -a -d ^mem | awk \{print $5}\ | sort | uniq -c