Linux 查看端口占用:netstat、ss、lsof 谁更好用?
1. 前言
在 Linux 部署服务时,经常会遇到端口相关问题:
- 启动服务时报
Address already in use; - 想知道 80 端口被谁占用;
- 想查看当前系统开放了哪些端口;
- 想确认服务到底有没有监听;
- 想结束占用端口的进程。
常用工具有三个:
netstat
ss
lsof
本文从端口排查角度讲清楚它们怎么用、有什么区别,以及实际项目中应该优先用哪个。
2. 端口占用是什么意思
当程序监听某个端口时,其他程序通常不能再监听同一个 IP 和端口组合。
例如 Nginx 已经监听 80 端口:
0.0.0.0:80
此时另一个程序再绑定 80 端口,就可能报错:
Address already in use
端口排查的核心就是找到:
哪个进程占用了哪个端口
3. ss:推荐优先使用
ss 是 socket statistics 的缩写。
它是现在 Linux 中更推荐使用的网络查看工具。
查看所有 TCP 监听端口:
ss -lntp
参数说明:
| 参数 | 含义 |
|---|---|
-l |
只看监听状态 |
-n |
数字显示,不解析服务名 |
-t |
TCP |
-u |
UDP |
-p |
显示进程信息 |
查看 80 端口:
ss -lntp | grep ':80'
示例输出:
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
可以看到:
端口:80
进程:nginx
PID:1234
4. ss 查看 UDP 端口
查看 UDP 监听端口:
ss -lnup
查看 TCP 和 UDP:
ss -lntup
如果没有 -p 权限,普通用户可能看不到进程名。
可以使用 sudo:
sudo ss -lntp
5. netstat:传统工具
netstat 是老牌网络工具。
很多教程中都会看到它。
查看监听端口:
netstat -lntp
参数含义和 ss 类似:
| 参数 | 含义 |
|---|---|
-l |
listening |
-n |
数字显示 |
-t |
TCP |
-u |
UDP |
-p |
显示进程 |
查看所有 TCP/UDP 监听端口:
netstat -lntup
查看 3306 端口:
netstat -lntp | grep ':3306'
6. netstat 可能没有安装
很多新系统默认不再安装 netstat。
如果提示:
netstat: command not found
可以安装 net-tools。
Ubuntu / Debian:
sudo apt install net-tools
CentOS / RHEL:
sudo yum install net-tools
不过新环境中更推荐直接使用 ss。
7. lsof:从文件角度看端口
Linux 中"一切皆文件"。
网络 socket 也可以看成进程打开的文件。
lsof 用于查看进程打开了哪些文件,也能查端口。
查看 80 端口:
sudo lsof -i :80
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
查看 TCP 端口:
sudo lsof -iTCP:80 -sTCP:LISTEN
查看某个进程打开的网络连接:
sudo lsof -i -p 1234
8. 三者区别
| 工具 | 特点 | 推荐场景 |
|---|---|---|
ss |
新、快、系统常见 | 日常端口查看优先用 |
netstat |
老牌、资料多 | 老系统或旧教程场景 |
lsof |
能关联进程打开文件 | 精确查某端口被谁占用 |
简单建议:
看监听端口:ss -lntp
查端口进程:lsof -i :端口
兼容旧教程:netstat -lntp
9. 查看端口是否监听
例如检查 8080:
ss -lntp | grep ':8080'
如果有输出,说明有服务监听。
如果没有输出,说明本机没有服务监听该端口。
也可以:
sudo lsof -i :8080
10. 查看所有开放端口
sudo ss -lntup
输出中重点看 Local Address:Port。
示例:
0.0.0.0:22
127.0.0.1:3306
0.0.0.0:80
含义:
| 地址 | 含义 |
|---|---|
0.0.0.0:80 |
所有网卡都监听 80 |
127.0.0.1:3306 |
只允许本机访问 3306 |
[::]:22 |
IPv6 所有地址监听 22 |
11. 127.0.0.1 和 0.0.0.0
这是端口排查中非常关键的点。
如果服务监听:
127.0.0.1:8080
只能本机访问。
如果监听:
0.0.0.0:8080
外部机器可以通过服务器 IP 访问。
例如:
curl http://127.0.0.1:8080
本机成功,但外部访问失败。
这时要检查服务是否只绑定了 127.0.0.1。
12. 根据 PID 查看进程
如果查到 PID 为 1234:
ps -fp 1234
查看进程启动命令:
cat /proc/1234/cmdline
格式可能没有换行,可以用:
tr '\0' ' ' < /proc/1234/cmdline
查看进程工作目录:
ls -l /proc/1234/cwd
13. 结束占用端口的进程
先查端口:
sudo lsof -i :8080
假设 PID 是 1234,正常结束:
kill 1234
如果无法退出:
kill -9 1234
更推荐先优雅停止服务:
systemctl stop 服务名
不要一上来就 kill -9,否则可能导致数据未写完或资源没有清理。
14. 实战:8080 端口被占用
启动服务时报错:
Address already in use: 8080
排查:
sudo ss -lntp | grep ':8080'
或:
sudo lsof -i :8080
找到进程后:
ps -fp PID
如果是旧服务,可以停止:
kill PID
如果是 systemd 服务:
systemctl status 服务名
systemctl stop 服务名
15. 实战:服务启动了但外部访问不了
本机查看:
ss -lntp | grep ':8080'
如果看到:
127.0.0.1:8080
说明只监听本机。
需要修改应用配置,把监听地址改成:
0.0.0.0
如果看到:
0.0.0.0:8080
但外部仍访问不了,继续排查:
firewall-cmd --list-ports
iptables -L -n
还要检查云服务器安全组。
16. 小结
查看端口占用推荐这样用:
ss -lntp
sudo ss -lntup
sudo lsof -i :8080
netstat -lntp
三者选择:
ss:日常首选
netstat:旧系统兼容
lsof:精确查端口对应进程
端口排查核心流程:
看端口是否监听
↓
看监听地址是 127.0.0.1 还是 0.0.0.0
↓
看对应进程和 PID
↓
看服务状态
↓
看防火墙和安全组
掌握这些命令后,大多数"端口被占用"和"服务访问不了"的问题都能快速定位。