服务器端口被占用了怎么办:用 ss 和 lsof 一步步定位进程

举报
yd_275127495 发表于 2026/10/30 06:59:59 2026/10/30
【摘要】 新服务起不来,日志里写着“Address already in use”,这是运维最常见的拦路虎之一。端口被谁占了、先别急着 kill,先定位,再决定是停掉旧进程、换端口,还是把冲突的服务挪走。Linux 自带的 ss 和 lsof 就够用,不用装额外工具。第一步:确认端口到底被谁占着。假设 8080 端口起不来,先看监听状态:ss -tlnp | grep 8080。-t 是 TCP,-l...

新服务起不来,日志里写着“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 验证。第三种,是系统服务或别的团队的服务占着,先沟通再动,不要直接杀掉不属于自己的进程。


第四步:防止下次再踩坑。定位完顺手做两件事:一是把端口分配记下来,写进部署文档或服务清单,避免下次又撞车;二是在启动脚本或健康检查里加上端口预检,启动前先判断端口是否空闲,冲突时直接报出占用进程,而不是等服务起不来再翻日志。端口冲突本身不可怕,可怕的是没查清就乱杀进程——先定位、再决策,几分钟就能稳妥解决。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。