查看端口占用 linux(长文解析)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在 Linux 系统中,端口是网络通信的“门牌号”,每个应用程序通过特定端口实现数据传输。当开发或运维过程中遇到服务无法启动、连接超时等问题时,排查端口占用情况往往是关键步骤。例如,Web 服务器默认使用 80 端口,若该端口被其他程序占用,网站将无法正常访问。本文将系统性地介绍 Linux 环境下查看端口占用的多种方法,并通过案例演示如何快速定位问题。


一、基础概念:端口与网络协议

1.1 端口的定义与作用

端口是操作系统为应用程序分配的逻辑编号,范围从 0 到 65535。类似快递员通过门牌号找到住户,网络数据包通过端口号找到对应的服务程序。例如:

  • HTTP 服务默认使用 80 端口
  • SSH 连接默认使用 22 端口
  • 数据库 MySQL默认使用 3306 端口

1.2 协议类型:TCP 与 UDP

  • TCP(传输控制协议):提供可靠、有序的数据传输,适合网页浏览、文件下载等场景。
  • UDP(用户数据报协议):注重速度而非可靠性,常用于实时通信如视频通话、在线游戏。 比喻:TCP 像是快递公司,确保包裹准确到达;UDP 则像外卖员,快速送达但可能偶尔丢失。

二、核心工具与命令详解

2.1 netstat:老牌端口检测工具

netstat 是网络统计工具,支持查看端口、路由表、网络连接状态等。

基础语法

netstat [选项]

常用参数组合

参数作用
-t显示 TCP 端口
-u显示 UDP 端口
-l列出监听中的端口
-n显示数字形式的端口号和 IP 地址
-p显示关联进程的 PID 和名称

实战案例:查看所有监听的 TCP 端口

netstat -tuln

输出示例:

Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN

解析

  • Proto:协议类型(tcp 或 udp)
  • Local Address:本地监听的 IP 和端口(0.0.0.0 表示所有网卡)
  • State:端口状态(LISTEN 表示正在监听)

扩展:结合进程信息

netstat -tulnp | grep 80

此命令可查看占用 80 端口的进程 PID 和名称,方便直接终止冲突进程。


2.2 ss:现代网络监控工具

ss(Socket Statistics)是 netstat 的替代工具,性能更高且功能更强大。

基础语法

ss [选项]

参数对比

功能netstat 命令ss 命令
查看所有 TCP 连接netstat -atss -ta
查看监听的 UDP 端口netstat -ulss -ul
显示进程信息netstat -pss -p

实战案例:快速定位端口占用

ss -tulnp | grep 3306

输出示例:

tcp   LISTEN   0      128    127.0.0.1:3306     *:*      users:(("mysqld",pid=1234,fd=24))

解析

  • users 字段直接显示进程名和 PID(如 mysqld 的 PID 是 1234)

2.3 lsof:多功能文件与端口监控

lsof(List Open Files)能查看进程打开的文件、网络连接及端口占用。

核心命令

lsof -i [端口号]

常见用法

  1. 查看特定端口占用

    lsof -i :80
    

    输出示例:

    COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    apache2 1234  root    6u  IPv4  12345      0t0  TCP *:http (LISTEN)
    

    其中 PID 为进程 ID,COMMAND 是进程名称。

  2. 过滤 TCP/UDP 协议

    lsof -i :53@udp
    

    此命令专门查看 UDP 协议占用 53 端口的进程(如 DNS 服务)。


2.4 nmap:网络扫描工具

nmap(Network Mapper)主要用于网络发现和安全审计,也能快速检测开放端口。

基础语法

nmap [选项] <目标地址>

实战案例:扫描本机开放端口

nmap -p 1-65535 localhost

输出示例:

PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
3306/tcp open  mysql

注意事项:扫描本地端口需权限,建议使用 sudo


三、进阶技巧与问题排查

3.1 终止占用端口的进程

当发现端口被无关进程占用时,可结合 kill 命令终止进程:

lsof -i :8080 | grep LISTEN

sudo kill -9 <PID>

3.2 自动化脚本:批量检测端口

编写脚本循环检查常用端口状态:

#!/bin/bash
for port in 22 80 443 3306; do
    ss -tulnp | grep ":$port" && echo "Port $port is in use" || echo "Port $port is free"
done

3.3 典型场景:服务启动失败

假设启动 Nginx 时提示端口 80 被占用:

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

解决方案:

  1. 使用 lsof -i :80 查找占用进程
  2. 若为旧 Nginx 进程残留,执行 systemctl restart nginx
  3. 若为其他服务(如 Apache),调整配置文件的端口号

四、常见问题与解决方案

4.1 问题:命令未安装

某些系统默认未安装 net-tools(包含 netstat)或 nmap

sudo apt install net-tools  # Debian/Ubuntu
sudo yum install net-tools  # CentOS/RHEL

sudo apt install nmap       # Debian/Ubuntu
sudo dnf install nmap       # CentOS 8+

4.2 问题:权限不足

部分命令需要 root 权限才能显示进程详情:

sudo ss -tulnp

4.3 问题:端口显示为 0.0.0.0

表示该端口监听所有网络接口,可正常访问。若需绑定特定 IP,修改服务配置文件的 Listen 参数。


五、结论与建议

通过本文介绍的 netstatsslsofnmap 等工具,开发者和运维人员能够快速定位 Linux 系统中的端口占用问题。建议:

  1. 定期监控关键端口:如 Web 服务的 80/443 端口、数据库的 3306 端口
  2. 善用组合命令:结合 grepawk 筛选信息
  3. 记录常见端口号:避免重复查找标准服务的端口配置

掌握这些技能后,当遇到“端口被占用”时,便能像侦探一样通过系统工具层层排查,迅速解决问题。后续可进一步学习 firewalldiptables,深入理解防火墙规则对端口的影响。

最新发布