当您启动服务并出现 address already in use(地址已被使用)错误时,说明该端口已被其他程序占用。在 Linux 服务器上,您可以通过三个简短的步骤识别并停止该进程。本指南以 Ubuntu 22.04 为例,使用 ss 和 kill 命令,但该方法适用于任何现代发行版。
第一步 - 查找监听端口的进程
使用 ss(netstat 的现代替代工具)列出绑定到特定端口的进程——此处以端口 8080 为例:
sudo ss -ltnp 'sport = :8080'
这些标志的含义如下:-l 表示监听套接字,-t 表示 TCP,-n 表示显示数字形式的端口(不解析名称),-p 表示显示所属进程。输出结果末尾包含一个 users:(...) 字段,其中指明了程序名称及其进程 ID (PID):
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* users:(("nginx",pid=1432,fd=6))
此处的 PID 为 1432。使用 sudo 至关重要:如果不使用它,ss 将隐藏您非所属套接字的进程详细信息。
第二步 - 在操作前确认进程身份
切勿在未查看的情况下直接终止 PID。请检查其实际身份:
ps -p 1432 -o pid,user,cmd
这将打印完整的命令行和所属用户,确保您停止的是正确的目标,而非您依赖的系统服务:
PID USER CMD
1432 www-data /usr/sbin/nginx -g daemon on; master_process on;
第三步 - 先优雅停止,再强制终止
首先发送 TERM 信号(默认信号)请求进程干净地关闭,这使其有机会关闭连接并刷新状态:
sudo kill 1432
等待一两秒后,重新运行第一步中的命令。如果端口已释放,则操作完成。如果进程忽略 TERM 信号仍在监听,则升级为使用 KILL 信号,进程无法捕获或忽略该信号:
sudo kill -9 1432
仅对卡死的进程保留使用 kill -9——因为它不给程序任何清理机会,可能会留下临时文件或失效的套接字。
结论
您使用 ss -ltnp 定位了绑定到端口的进程,通过 ps 进行了验证,并使用逐步升级的 kill 命令停止了它。将 sudo ss -ltnp 'sport = :PORT' 保存为 Shell 别名,可使下一次“地址已被使用”错误的修复时间缩短至十秒。
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。