必须用lsof、ss或netstat定位占用端口的进程:lsof -i :8080直接查端口;ss -tulnp | grep ':8080\s'精确匹配;netstat -tulnp配合ps验证PID真实性。

当你在Ubuntu上启动服务时遇到“Address already in use”错误,必须立刻定位占用目标端口的进程,否则无法继续调试或部署。
用lsof直接查端口对应进程
这一步最直接,适合已知端口号(如8080、3306)的场景。
在终端中执行:sudo lsof -i :8080
如果端口未被占用,命令无任何输出;若被占用,会列出COMMAND、PID、USER、NAME等字段。注意:NAME列显示*:8080表示监听所有IP,127.0.0.1:8080表示仅本地监听。
该命令依赖lsof工具,若提示command not found,先运行sudo apt install lsof安装。
用ss快速筛选监听进程
ss比netstat更快,是当前Ubuntu默认推荐的替代方案,尤其适合高负载环境。
方法一:查看所有监听端口并过滤
sudo ss -tulnp | grep :8080
方法二:精确匹配端口(避免误匹配如80801)
sudo ss -tulnp | grep ':8080\s'
末尾的\s确保只匹配独立端口号,防止grep把80801、80809也带出来。
输出中users字段括号内即为进程名和PID,例如users:(("node",pid=12345,fd=23))。
用netstat确认进程归属(兼容旧系统)
某些定制化Ubuntu镜像可能未预装ss或lsof,netstat仍是可靠 fallback 选项。
第一步:执行完整监听列表查询
sudo netstat -tulnp
第二步:定位目标端口行
找到Local Address列含:8080的行,检查最后一列“PID/Program name”。若显示-,说明权限不足,必须加sudo重试。
第三步:验证进程真实性
ps -p 12345 -o pid,comm,args(将12345替换为实际PID)
这能确认该PID是否真实存在、是否仍在运行,避免因进程已退出但端口残留导致误判。











