Linux 中如何查看端口占用情况
        
        作者:youqing · 2025-04-01 · 阅读时间:6分钟
    
    
    
          
     
    
        
    
    
        
        
    
     在服务器管理、网络调试或应用部署过程中,端口占用问题是最常见的故障场景之一。Linux系统提供了多种高效工具帮助开发者快速定位端口占用情况,本文将通过 8个核心命令、5种实战场景 和 3个进阶技巧,系统梳理端口检测的完整解决方案。
一、端口检测的核心价值
1. 典型应用场景
- 服务启动失败:当Apache/Nginx提示"Address already in use"时
 - 安全审计:检测未授权的端口监听(如可疑后门程序)
 - 网络优化:排查异常连接占用带宽资源
 - 容器管理:解决Docker端口映射冲突问题
 
2. 关键术语解析
- LISTEN状态:服务程序主动监听的端口
 - ESTABLISHED:已建立的TCP连接
 - PID/Program:进程标识与程序名称的对应关系
 
二、六大核心命令详解
1. netstat:经典网络统计工具
基础语法
netstat -tunlp | grep 
参数解析
-t:显示TCP端口-u:显示UDP端口-n:禁用域名解析(加速输出)-l:仅显示监听状态的端口-p:显示进程PID/名称(需sudo权限)
示例输出
Proto Recv-Q Send-Q Local Address Foreign Address State       PID/Program name
tcp6       0      0 :::8080                 :::*                    LISTEN      2871/java
优缺点
- 优势:兼容性好(适用于旧系统)
 - 局限:部分新系统需安装
net-tools包 
2. lsof:基于进程的文件检测
快速定位命令
sudo lsof -i :80
关键参数
-i:指定网络连接(格式:端口/@主机)-P:禁止端口号转服务名称(显示原始数字)-n:禁用主机名解析
输出示例
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1234 root    6u  IPv4 0xabcd      0t0  TCP *:http (LISTEN)
特殊应用
- 查看指定用户进程:
lsof -u apache -i - 检测IPv6连接:
lsof -i 6 
3. ss:netstat的高效替代品
现代Linux推荐命令
ss -tulnp | grep '80'
参数说明
-t:TCP协议-u:UDP协议-l:监听状态-n:数字格式-p:显示进程信息
性能优势
- 数据获取速度比
netstat快30% - 支持更详细的TCP状态显示(如
ss -o state time-wait) 
4. fuser:通过端口反向查找进程
精准定位
sudo fuser 80/tcp
输出解析
80/tcp:               1234  5678
- 显示数字为占用端口的PID列表
 -k参数可直接终止进程(慎用!)
5. /proc 文件系统:底层信息直接读取
手动查询方法
ls -l /proc//fd | grep socket:
- 通过
/proc/net/tcp文件解析端口号(16进制) - 示例:本地端口
1F90(8080)=echo $((0x1F90)) 
6. nmap:端口扫描利器
扫描本机开放端口
nmap -sT -O 127.0.0.1
参数组合
-sS:SYN半开扫描(需要root权限)-p 1-65535:全端口范围检测--open:仅显示开放端口
三、五大实战场景解析
场景1:快速定位HTTP服务冲突
sudo ss -tlnp | grep ':80b'
b确保精确匹配80端口- 验证Nginx/Apache是否重复绑定
 
场景2:检测Docker容器端口泄漏
docker ps --format "{{.Ports}}" | awk -F'->' '{print $1}'
sudo lsof -i -P -n | grep -v 'docker-proxy'
- 第一命令列出容器声明端口
 - 第二命令过滤非Docker进程
 
场景3:追踪异常外联请求
sudo netstat -atnp | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c
- 统计所有已建立连接的外网IP
 - 检测是否有可疑IP高频通信
 
场景4:排查TIME_WAIT堆积
watch -n 1 'ss -o state time-wait | wc -l'
- 动态监控TIME_WAIT状态连接数
 - 超过2000可能需调整
tcp_max_tw_buckets 
场景5:Kubernetes环境端口检测
kubectl get pods -o json | jq '.items[].spec.containers[].ports[]'
nsenter -t  -n ss -ltn
- 第一命令查看集群端口声明
 - 第二命令进入容器网络命名空间检测
 
四、三个进阶技巧
1. 自动化监控脚本
#!/bin/bash
PORT=8080
while true; do
  if ss -tln | grep -q ":$PORT"; then
    echo "$(date): Port $PORT is occupied" >> port_monitor.log
    break
  fi
  sleep 10
done
2. 火焰图定位瓶颈
perf record -e syscalls:sys_enter_accept -a
perf script | flamegraph.pl > port_accept.svg
- 可视化分析端口接受连接的系统调用
 
3. eBPF深度追踪
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_accept { printf("%s %dn", comm, args->fd); }'
- 实时监控所有accept系统调用
 
五、常见问题FAQ
Q1: 为什么netstat显示127.0.0.1:8080和:::8080两种监听?
A: 分别表示IPv4和IPv6协议栈的监听,可通过sysctl net.ipv6.bindv6only=1调整绑定策略。
__Q2: TIME_WAIT状态是否影响服务重启?__
A: 是,可通过sysctl net.ipv4.tcp_tw_reuse=1加速端口复用。
Q3: 如何永久保存端口监控配置?
A: 使用systemd创建定时器单元或配置crontab任务。
六、总结与工具对比
| 工具 | 速度 | 信息详细度 | 易用性 | 适用场景 | 
|---|---|---|---|---|
netstat | 
中 | 高 | 优 | 兼容旧系统 | 
ss | 
快 | 高 | 良 | 现代Linux性能分析 | 
lsof | 
慢 | 极高 | 中 | 进程级深度排查 | 
nmap | 
慢 | 中 | 中 | 安全审计与全端口扫描 | 
掌握这些工具的组合使用,可覆盖从基础运维到性能调优的全场景需求。建议在日常工作中优先使用ss+lsof组合,在复杂网络问题中引入eBPF等高级技术,构建多层次的端口监控体系。
热门推荐
        一个账号试用1000+ API
            助力AI无缝链接物理世界 · 无需多次注册
            
        3000+提示词助力AI大模型
            和专业工程师共享工作效率翻倍的秘密
            
        热门API
- 1. AI文本生成
 - 2. AI图片生成_文生图
 - 3. AI图片生成_图生图
 - 4. AI图像编辑
 - 5. AI视频生成_文生视频
 - 6. AI视频生成_图生视频
 - 7. AI语音合成_文生语音
 - 8. AI文本生成(中国)
 
最新文章
- 如何实现Mock API以进行API测试 | Zuplo博客
 - 解读 TaskMatrix.AI
 - API协议设计的10种技术
 - ComfyUI API是什么:深入探索ComfyUI的API接口与应用
 - 从架构设计侧剖析: MCP vs A2A 是朋友还是对手?
 - Kimi Chat API入门指南:从注册到实现智能对话
 - 免费查询公司注册信息API的使用指南
 - 防御 API 攻击:保护您的 API 和数据的策略
 - 香港支付宝实名认证:是什么?怎么用?
 - 如何获取 Coze开放平台 API 密钥(分步指南)
 - 如何保护您的API免受自动化机器人和攻击 | Zuplo博客
 - ASP.NET Core Minimal APIs 入门指南 – JetBrains 博客