服务器端口被占用了怎么办:用 ss 和 lsof 一步步定位进程
新服务起不来,日志里写着“Address already in use”,这是运维最常见的拦路虎之一。端口被谁占了、先别急着 kill,先定位,再决定是停掉旧进程、换端口,还是把冲突的服务挪走。Linux 自带的 ss 和 lsof 就够用,不用装额外工具。
第一步:确认端口到底被谁占着。假设 8080 端口起不来,先看监听状态:ss -tlnp | grep 8080。-t 是 TCP,-l 只看监听,-n 不反查域名,-p 显示进程。输出里如果有类似 users:(("java",pid=1234,fd=56)),占着端口的就是 PID 1234 的 java 进程。没输出则说明端口其实没被占,报错可能来自别的地址绑定问题,比如配置文件里写错了监听地址。
第二步:用 lsof 反查进程详情。拿到 PID 后,再看这个进程到底是什么:lsof -i :8080;ps -p 1234 -o pid,ppid,cmd。lsof -i :端口 能列出占用该端口的进程和用户;ps 再看完整启动命令。很多“幽灵占用”其实是上次没退干净的旧服务,或者是另一个本该跑在别的端口的程序配错了端口。看到完整命令再动手,比盲目 kill 安全得多。
第三步:按情况处理,不是一律 kill。分三种情况处理。第一种,旧进程已经没用了,确认无业务影响后停掉它:先用程序自己的停止方式,比如 systemctl stop,或者发 SIGTERM 让它正常退出;只有 SIGTERM 不起作用时才用 kill -9。第二种,两个服务都要跑,那就改新服务的端口,改完重启并重新用 ss 验证。第三种,是系统服务或别的团队的服务占着,先沟通再动,不要直接杀掉不属于自己的进程。
第四步:防止下次再踩坑。定位完顺手做两件事:一是把端口分配记下来,写进部署文档或服务清单,避免下次又撞车;二是在启动脚本或健康检查里加上端口预检,启动前先判断端口是否空闲,冲突时直接报出占用进程,而不是等服务起不来再翻日志。端口冲突本身不可怕,可怕的是没查清就乱杀进程——先定位、再决策,几分钟就能稳妥解决。
- 点赞
- 收藏
- 关注作者
评论(0)