用 ss 取代 netstat,快速查清端口占用

举报
yd_240997615 发表于 2026/11/08 20:20:10 2026/11/08
【摘要】 服务起不来,报错里经常出现一句“端口已被占用”。这时候第一步不是急着改端口,而是先查清楚到底是哪个进程占着这个端口。很多人习惯用 netstat,但现在多数 Linux 发行版默认已经不再预装它,取而代之的工具是 ss:它是 iproute2 套件的一部分,输出更快、筛选更灵活,查端口占用用它就够了。最直接的查法是按端口查。想知道 8080 端口被谁占了,用 ss -tlnp | grep ...

服务起不来,报错里经常出现一句“端口已被占用”。这时候第一步不是急着改端口,而是先查清楚到底是哪个进程占着这个端口。很多人习惯用 netstat,但现在多数 Linux 发行版默认已经不再预装它,取而代之的工具是 ss:它是 iproute2 套件的一部分,输出更快、筛选更灵活,查端口占用用它就够了。

最直接的查法是按端口查。想知道 8080 端口被谁占了,用 ss -tlnp | grep 8080,其中 -t 表示 TCP,-l 表示只看监听状态,-n 表示不解析服务名、直接显示数字端口,-p 显示占用端口的进程。输出里能看到监听地址、端口,以及进程名和 PID,拿到 PID 之后就能决定是停掉它、还是把新服务换个端口。如果不加 grep,直接用 ss -tlnp 可以列出本机所有监听端口,快速扫一遍有没有不该开的服务。

光看监听还不够,有时候问题出在连接状态上。比如服务明明在跑,客户端却连不上,可能是连接卡在了某个状态。这时可以用 ss -tan 看全部 TCP 连接,ESTAB 表示已建立,TIME-WAIT 是刚断开还在等待的连接,SYN-SENT 表示正在尝试建立但对方没回应。连接数异常暴涨、大量 TIME-WAIT 堆积,往往指向连接没有正常释放,或者对端服务响应变慢,先看状态分布再决定往哪个方向查,比逐条翻日志快。

ss 的筛选语法也值得用起来。不用每次都靠 grep,可以直接写条件,比如 ss -t state established ‘( dport = :443 or sport = :443 )’ 只看与 443 端口相关的已建立连接;ss -t dst 203.0.113.10 只看发往某个地址的连接。把条件写进命令里,输出本身就是答案,不用再二次过滤,排查脚本里也可以直接复用。

还有几个日常组合很实用。ss -x 可以看 Unix 域套接字,有些本地服务不走 TCP 端口、只走套接字文件,查端口查不到它时就用这个。ss -s 能看到各类套接字的统计总数,怀疑连接泄漏时先看总数是不是在持续上涨。ss -tlnp 加上 -o 可以看到 TCP 计时器信息,判断连接是不是卡在重传上。输出看不懂时先记住一列就够了:Local Address:Port 是本机监听或连接的端口,Peer Address:Port 是对端,State 是当前状态。

查到占用进程之后,处理也有讲究。先确认这个进程是不是自己人:是不是之前启动后没退干净的旧进程、是不是另一个本该跑在这个端口的服务。如果是旧进程残留,用 kill 掉 PID 再重启服务;如果确实是两个服务撞了端口,改新服务的配置比杀掉正在跑的生产服务安全。动手之前先用 ps -p PID 看一眼进程的启动命令,确认无误再操作,不要凭端口号猜进程身份。

从 netstat 换到 ss 不需要重新学一套概念,查监听、查连接、查进程这三件事对应起来就行。养成“报错先查端口、查端口先看进程”的习惯,端口冲突这类问题几分钟就能定位,不用再靠反复重启碰运气。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。