你有过这种经历吗?改完配置高高兴兴重启服务,结果屏幕上蹦出来一句 Address already in use,服务没起来,你还得满世界找原因。其实这句话翻译成大白话就一个意思:你要用的这个端口,已经被别人占了。占它的可能是你上次没停干净的服务,也可能是别的程序。反正先别上头,查清楚是谁占的再说。

先学会用ss,一条命令看穿
现在的新系统里,ss是查端口的主力,基本都自带,不用装。想看8080被谁占了,就这么敲:
ss -tlnp | grep 8080。出来的结果里会有一行类似 Users:((“nginx”,pid=1234,fd=8)) 的东西,这就告诉你,是pid 1234那个nginx进程占着8080。要是没看到进程名,大概率是你权限不够,前面加个sudo再试一次就行。
lsof也不赖,老牌的香
老运维肯定还惦记着lsof,它也挺好用,就是得先装:CentOS上yum install -y lsof,Debian系就apt install -y lsof。装完查端口:lsof -i:8080,一样能告诉你谁占着。两个工具选一个用就行,别纠结,顺手最重要。
知道是谁了,然后呢
找到了占用进程,先别急着kill。你得先想想:这进程还在正常干活吗?如果是个僵尸服务、上次没停干净的老进程,那kill掉没毛病;但要是数据库、线上网站这种正经服务占着端口,你把它杀了那可就闯祸了。这种情况正确的做法是:让新服务换个端口,或者先把老服务正常停掉再启新的。
真要kill的话,先ps -fp 那个PID看一眼启动命令,确认没杀错人,再kill PID。kill不死再上kill -9,但记住,-9是最后的手段,对数据库这种进程用-9,搞不好数据就不一致了,别问我怎么知道的,都是泪。
几个容易踩的小坑,顺便提醒下
第一,服务反复起不来,检查下是不是有守护进程在自动拉起旧实例,俩实例抢一个端口,那肯定有一个要报错。第二,容器环境里端口冲突,先看宿主机的占用,别光在容器里折腾。第三,你服务监听在127.0.0.1上,那只能本机访问,想对外提供服务得监听0.0.0.0或者具体网卡IP,这个坑好多新手都会踩,症状跟端口被占完全两码事,别搞混了。
Windows服务器上怎么查,顺带说下
别以为只有Linux会端口打架,Windows服务器一样会,IIS端口被占也是常有的事。Windows上就用netstat,打开命令行敲:netstat -ano | findstr 8080,最后一列就是PID,然后去任务管理器或者tasklist /fi “pid eq 那个数字” 看看是哪个进程。看着有点绕,其实跟Linux一个思路,就是工具名不一样罢了。
看到一堆TIME_WAIT别慌,那不是病
还有个场景新手容易误会:用ss -a一看,好家伙,端口上一大堆TIME_WAIT状态的连接,以为出大事了。其实TIME_WAIT是TCP正常关闭连接后的一个收尾状态,高并发的短连接服务上特别常见,过一会儿自己就消失了。真正要留意的是端口被大量ESTABLISHED连接占着不撒手,那才是异常,多半是程序没释放连接或者被人连爆了。所以别一看到TIME_WAIT就想着调内核参数,先分清状况再说。
顺手说个防患于未然的招
平时写启动脚本的时候,养成先检查端口再启动的习惯,脚本里加一句判断,端口被占了就报个清晰的提示,别让服务闷头启动失败,然后你对着空日志发呆。反正端口排查就三板斧:ss或lsof找出占用者、ps核实身份、决定是杀掉还是换端口,顺序别乱,准没错。三板斧使完,Address already in use这货基本就再也吓不到你了,下次再见它,你反而能乐出来——又来活儿了呗,这行当就这样,见怪不怪了。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!