Ubuntu 怎么查看端口占用,并释放被占用的端口

问题

在 Ubuntu 服务器上部署应用,启动时报「Address already in use」或「端口已被占用」,程序起不来。想知道是哪个进程占着这个端口,又不敢乱杀进程,应该怎么查、怎么释放?

问题补充

常见于 80、443、8080、3306 这类常用端口:旧应用停了但进程没退干净、两个程序抢同一个端口、或者系统服务默认占用了想用的端口。

原因

  1. 旧进程残留:上一次的应用异常退出,子进程还挂在后台持有端口,新实例自然绑不上。
  2. 端口冲突:计划使用的端口已被系统服务(如 80 被 Nginx/Apache 占用)或其他应用占用。
  3. 服务托管未释放:进程由 systemd 或容器托管,手工杀了进程,托管方又把它拉起来继续占端口。

解决

  1. 先查谁占着端口。sudo ss -tlnp | grep :8080 列出监听 8080 端口的进程及 PID;习惯 netstat 的用 sudo netstat -tlnp | grep :8080;也可以 sudo lsof -i :8080 获得同样信息,输出里的进程名和 PID 就是答案。
  2. 确认进程身份再决定处置。用 ps -fp <PID> 看该进程是什么程序、属于谁——确认是自己要停的旧实例再动手,别误杀系统服务。
  3. 终止进程释放端口。普通进程 kill <PID>,不退出再 kill -9 <PID>;由 systemd 管理的服务用 sudo systemctl stop 服务名 停,否则杀掉会被自动拉起。
  4. 处理容器场景。端口被 Docker 容器占用时,sudo docker ps 找到对应容器,docker stop 停掉或改其端口映射,而不是在宿主机层面硬找。
  5. 验证端口已释放。重新执行第一步的查看命令,输出为空即释放完成,再启动目标应用。

预防

应用配置里统一规划端口并登记,避免多个服务默认配置撞车;长驻服务一律交给 systemd 或容器编排管理,启停走正规通道,不留孤儿进程。贵州诚鑫致达科技为企业提供 Linux 服务器部署与运维支持,相关方案可贵州诚鑫致达科技 查阅。

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

小团队起步上手 NAS,群晖机型参考:DS425+ · DS224+ · DS124。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。

服务区域|贵州诚鑫致达

贵州群晖NAS、贵阳存储、数据备份、信创云盘或 IT 集成服务,可联系贵州诚鑫致达科技,服务范围覆盖贵州全省各市州。广西南宁企业存储与网络建设维护,本地化技术支持。