端口被占用启动失败?lsof和ss一出手,立马揪出元凶

你有过这种经历吗?改完配置高高兴兴重启服务,结果屏幕上蹦出来一句 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这货基本就再也吓不到你了,下次再见它,你反而能乐出来——又来活儿了呗,这行当就这样,见怪不怪了。

【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!

(0)
爱家的头像爱家
域名解析半天不生效?别傻等,先搞懂它为啥这么慢
上一篇 2026-09-07 02:00
服务器时间老是不准?配置一次chrony,日志终于对得上号了
下一篇 2026-09-07 03:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

广告合作

QQ:14239236

在线咨询: QQ交谈

邮件:asy@cxas.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信