Linux 入门:用 ss 快速查出谁占用了端口
【摘要】 云主机上部署服务时,最常见的报错之一是 Address already in use:想监听 80、8080 或 3000,却发现端口已被占用。不必先乱杀进程,用系统自带的 ss(iproute2)就能在几秒内定位是谁占着口,比翻 /var/log 或盲目 kill 稳得多。 1. 先看某个端口有没有人听ss -lntp | grep ':8080'参数含义很直接:-l:只看 listeni...
云主机上部署服务时,最常见的报错之一是 Address already in use:想监听 80、8080 或 3000,却发现端口已被占用。不必先乱杀进程,用系统自带的 ss(iproute2)就能在几秒内定位是谁占着口,比翻 /var/log 或盲目 kill 稳得多。
1. 先看某个端口有没有人听
ss -lntp | grep ':8080'
参数含义很直接:
-l:只看 listening(正在监听)-n:端口用数字,不做服务名反查,输出更干净-t:只看 TCP;UDP 服务请改用-u-p:尽量显示进程名和 PID(需要相应权限)
典型输出里会出现 users:(("node",pid=1234,fd=23)),这就是占用进程。如果没有 -p 或权限不够看不到进程名,先记下本地地址和状态,再配合 ps -fp <pid> 继续查。
2. 看本机对外连了哪些端口
排查「连不上下游 API / 数据库」时,除了看监听,也要看 outbound:
ss -ntp | grep ':443'
能快速确认本机是否真的在建连、卡在 SYN-SENT,还是已经进入 ESTAB。若长时间停在 SYN-SENT,多半是安全组、防火墙或对端没通,而不是本机应用逻辑问题。
3. 几个常见坑
- 看错协议:服务听的是 UDP,你只查了 TCP。加上
-u:ss -lnup。 - IPv4 / IPv6:
*:8080和[::]:8080可能是两个监听;只停了一个,另一个仍占口。 - 容器网络:宿主机
ss看到的经常是 docker-proxy 或 CNI 转发,进容器再查一次才是业务进程。 - 权限:非 root 时
-p经常看不到别人的进程名,需要sudo或换有权限的账号。 - TIME-WAIT 不是占用监听:大量
TIME-WAIT通常不影响新服务 bind 同一端口(除非开了特殊 reuse 限制),别被吓到。
4. 和 lsof、netstat 怎么选
- 现代发行版优先
ss,比传统netstat更快、信息更全。 - 需要「哪个文件句柄对应端口」时再用
lsof -i :8080。 - 写巡检脚本时,
ss -lntp的输出格式相对稳定,比解析netstat省心。
5. 定位后怎么处理
确认进程后,按场景处理即可:业务该在跑就改新服务监听端口;是残留进程或旧容器就停掉;是系统服务就 systemctl status 看是否被意外拉起。改端口后记得同步安全组与反向代理配置,避免「进程起来了,外面还是进不来」。
下次再遇到端口冲突,先跑一句 ss -lntp | grep ':端口',确认协议、地址族和进程,再决定改端口、停旧进程还是查容器转发——通常比反复重启服务更快定位根因。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)