Linux 怎么查看端口占用?ss/lsof/netstat 定位进程
答案:首选 sudo ss -tlnp | grep :端口(监听 + 进程),或 sudo lsof -i :端口。看到的若是 LISTEN 才是服务占用;ESTABLISHED/TIME-WAIT 是已有连接,不影响服务绑定。
一、ss:现代首选
ss -tlnp # 所有 TCP 监听端口 + 进程
sudo ss -tlnp | grep :8080 # 查 8080 被谁监听
ss -tlnp | grep -E ':80|:443' # 同时查多个
ss -ulnp # UDP 监听(DNS 等)
ss -tnp state established # 只看已建立的 TCP 连接
ss -s # 套接字汇总统计(各状态计数)| 参数 | 含义 |
|---|---|
-t / -u | TCP / UDP |
-l | 只看 LISTEN(监听) |
-n | 数字显示,不反解主机名/服务名(快) |
-p | 显示占用进程(需 root/sudo) |
服务起不来报 "address already in use",直接
sudo ss -tlnp | grep :端口找 LISTEN 行最后一列的 users:(("nginx",pid=...))。去掉-l才能看到 ESTABLISHED 连接。
二、lsof:按端口反查进程
sudo lsof -i :8080 # 谁在用 8080(含监听和连接)
sudo lsof -iTCP -sTCP:LISTEN -P -n # 所有 TCP 监听,-P 不把端口转服务名
sudo lsof -i :3000 -t # 只输出占用 PID,方便 kill $(...)
lsof -i :端口的好处是直接给出 PID、用户、命令名,配合-t能一行释放端口:sudo kill $(sudo lsof -t -i:8080)。完整用法见 lsof 命令。
三、netstat:老系统
netstat -tlnp 2>/dev/null | grep :80 # 很多最小化系统已不带 netstat
# 没有就装 net-tools,或直接改用 ss(推荐)四、连接状态与常见误判
ss -ant | awk 'NR>1{print $1}' | sort | uniq -c # 统计各 TCP 状态数量
# 5 LISTEN
# 120 ESTAB
# 900 TIME-WAIT- LISTEN:有服务在监听,这才是"端口被占用"。
- ESTAB:已建立连接,正常业务流量。
- TIME-WAIT:主动关闭方的正常回收态,不占监听,不阻止服务启动;高并发短连接下大量出现属正常,必要时调
net.ipv4.tcp_tw_reuse与本地端口范围(见 TIME_WAIT 原理)。 - 看到
127.0.0.1:端口说明服务只绑了回环、外部访问不到;0.0.0.0:端口或:::端口才是对外监听——"本机能连、别的机器连不上"多是绑定地址或防火墙问题。
排查"服务起不来/连不上"的固定顺序:
ss -tlnp确认有没有 LISTEN、绑在哪个地址 →lsof -i确认进程 → 再查防火墙/安全组。通不通的网络层验证用 nc-zv host port,连接计数见本文关联的连接数 FAQ。
FAQ
Q: 怎么查端口被谁占用? A: sudo ss -tlnp | grep :端口 或 sudo lsof -i :端口,-p 要 root 才显示进程名。
Q: ss 还是 netstat? A: 优先 ss(快、iproute2),老系统 netstat -tlnp;参数 -t/-u/-l/-n/-p 含义一致。
Q: LISTEN 和 ESTABLISHED? A: LISTEN 是等待新连接的监听占用;ESTABLISHED 是已建立连接,加 -l 只看监听。
Q: 看不到进程名? A: 没用 root,加 sudo;个别端口由内核(RPC/NFS)占用,不对应普通进程。
Q: 大量 TIME-WAIT 是占用吗? A: 不是监听占用,是连接关闭后的正常状态,不阻止绑定;高并发短连接可调 tw_reuse,见 TIME_WAIT 原理篇。
一句话总结:查端口占用用 sudo ss -tlnp(或 lsof -i :端口),LISTEN 才是真占用、ESTAB/TIME-WAIT 不是;看不到进程名先加 sudo;绑在 127.0.0.1 外部不可达,"本机能连外部不通"再查防火墙,连通用 nc 验证。