推荐优先使用 ss 查看端口占用,因其更快更轻量;ss -tuln 查监听端口,加 -p(需 root)显示进程,netstat 仅用于旧系统兼容。

linux 查看端口占用,最常用也最有效的是 ss 和 netstat,但要注意:netstat 已被逐步淘汰,ss 是现代替代方案,更快更轻量,推荐优先使用。
用 ss 快速查端口占用(推荐)
ss(socket statistics)是 iproute2 套件的一部分,内核级支持,响应快、信息全。查看某端口(比如 8080)是否被占用:
- ss -tuln | grep :8080 —— 查监听中的 TCP/udp 端口(-t TCP, -u UDP, -l 仅显示监听, -n 不解析名称)
- ss -tulnp | grep :8080 —— 加 -p 显示进程名和 PID(需 root 权限,普通用户会提示 “Permission denied”)
- 若看到类似
LISTEN 0 128 *:8080 *:* users:(("nginx",pid=1234,fd=6)),说明 nginx 进程(PID 1234)占用了 8080
用 netstat 查端口(兼容旧系统)
netstat 属于 net-tools 包,部分新发行版默认不安装(如 ubuntu 22.04+、centos 8+),需手动装:sudo apt install net-tools 或 sudo yum install net-tools。
- netstat -tuln | grep :3306 —— 查 mysql 默认端口
- netstat -tulnp | grep :3306 —— 加 -p 显示进程(同样需要 sudo)
- 输出示例:
tcp6 0 0 :::3306 :::* LISTEN 1234/mysqld,其中 1234 是 PID,mysqld 是进程名
查到 PID 后怎么操作?
拿到占用端口的进程 PID(比如 1234),可进一步确认或处理:
- ps -p 1234 -o pid,ppid,cmd,%mem,%cpu —— 查进程详细信息
- lsof -i :8080 —— 另一种方式(需安装 lsof:
sudo apt install lsof),输出更直观 - 如需结束进程:sudo kill 1234(温和终止)或 sudo kill -9 1234(强制终止)
常见问题与注意点
- 非 root 用户执行
-p参数会看不到进程名,直接报错或空白 —— 记得加 sudo - 某些服务(如 docker 容器、systemd socket 激活服务)可能显示为
docker-proxy或systemd占用端口,需结合docker ps或systemctl list-sockets追踪 - ipv6 地址(:::80)和 IPv4(*:80)可能分开显示,
ss -tuln默认都包含,不用额外加参数 - 如果端口“查不到占用”,但启动服务仍报“Address already in use”,可能是 TIME_WAIT 状态残留,可用
ss -tan state time-wait | grep :8080检查
基本上就这些。ss 是当前首选,netstat 用于过渡或排查老环境;关键是加 -p 看进程、用 sudo 提权、结合 ps 或 lsof 交叉验证。不复杂但容易忽略权限和协议细节。