服务启动就报address already in use?端口被占用的排查三步走

半夜重启业务服务器,别的服务都起来了,就有一个怎么也起不来。翻开日志,只有一行 address already in use。这个报错直译过来就是「地址已经被使用」——你要监听的那个端口,已经被别的进程先占了。很多人到这里就开始反复重启服务器,其实报错本身已经把方向指得很清楚:先别急着重启,去查端口。

先弄懂服务为什么要「占」端口

一个网络服务要收发数据,启动时第一步就是向系统申请一个端口(术语叫 bind,绑定)。绑定成功了,客户端才能通过「IP 加端口」找到它。所谓 address already in use,就是绑定这一步失败了——端口名花有主。比如自建的数据服务常用 6379 端口,如果上次的实例没退干净、或者系统自启又手动起了第二次,第二个实例就会卡在这一步。

第一步,查清是谁占的

Linux 上一条 ss -tlnp 加 grep 端口号,占用端口的进程名和进程号直接列出来;老系统没有 ss 就用 netstat 同样能查。Windows 上是 netstat -ano 查到进程号,再对着任务管理器的 PID 列找进程。这一步只要一分钟,却决定了后面所有动作的方向。

第二步,判断它为什么还占着

查到的进程分两类,处置完全不同。一类是真进程还活着:要么上次关服务没关干净,要么一个服务被自启和手动两种方式各起了一遍,双实例自己撞自己。另一类是短暂占用:连接刚断开,系统要等一小段时间才释放端口,这种情况等一两分钟再启动,往往自己就好了,不用做任何操作。

第三步,再决定绕还是杀

确认占着的进程是谁之后再动手:是自己的旧实例,就先把旧的正常停掉再起服务;是别的业务在用这个端口,就把新服务的端口改掉,同时记得通知所有连它的客户端同步改;查出来路不明的进程,先看清它的安装路径和启动者再处置,不要上来就杀。贵州诚鑫致达科技在给客户做服务器代维时,处理这类报错的固定顺序就是先查、再判、最后才动——顺序反了,很容易旧问题没解决又杀出新问题。

记住一句话:看到 address already in use,第一反应不是重启,是查端口。查清是谁占的,这个故障就已经解决了一半。

企业存储选型参考|贵州诚鑫致达

做备份容灾一体机方案,群晖机型参考:DP7400 · DP520 · DP320。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。