用 ss 取代 netstat,快速查清端口占用
服务起不来,报错里经常出现一句“端口已被占用”。这时候第一步不是急着改端口,而是先查清楚到底是哪个进程占着这个端口。很多人习惯用 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 不需要重新学一套概念,查监听、查连接、查进程这三件事对应起来就行。养成“报错先查端口、查端口先看进程”的习惯,端口冲突这类问题几分钟就能定位,不用再靠反复重启碰运气。
- 点赞
- 收藏
- 关注作者
评论(0)