ss -lntp | grep ':8080' lsof -i :8080 -sTCP:LISTEN sudo ss -lntpe | grep 8080 systemctl status old-app --no-pager
新版本启动时没报 address already in use,两个进程都监听 8080,请求随机落到旧服务上,ss 里能看到两条同端口记录,日志也分不清是谁在回。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,SO_REUSEPORT 允许内核把同一端口的连接分给多个 socket,框架和守护脚本常默认打开,旧进程没退干净也不会报冲突,问题就被藏起来了,很难第一时间想到。
这次卡住的地方就在「SO_REUSEPORT」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
处理上按这个顺序:用 ss 带 p 参数看同一端口挂着几个 pid 两条记录就是信号;翻启动参数和框架配置里的 reuse_port 开关 很多框架默认是开的;先停掉旧进程再启动 或者关掉该选项让 bind 正常报错 取舍看发布方式。
改完只确认一件事:ss 里该端口只剩一个 pid 并且请求不再出现旧版本的响应 灰度机先验证。
