总结了三种方法,来源:https://stackoverflow.com/questions/39322089/node-js-port-3000-already-in-use-but-it-actually-isnt
0. 常见场景和注意事项
- Web 服务器: 80 和 443 端口通常用于 HTTP 和 HTTPS,如果你的 Web 服务器无法启动,可能是这些端口被其他服务占用。
- 数据库服务器: 不同的数据库有默认的端口号(例如 MySQL 是 3306,PostgreSQL 是 5432),检查这些端口是否被占用。
- 多个服务: 当你在同一台机器上运行多个服务时,注意避免端口冲突。
- Docker: 如果端口被 Docker 容器占用,可以使用 docker ps 找到容器,然后停止或删除它。
- 权限: 某些端口(小于 1024 的端口)可能需要 root 权限才能使用,确保你的服务运行的用户有足够的权限。
1. 通过搜索端口定位进程来关闭
对于Linux/Mac OS搜索(sudo)
请在终端中运行以下命令:
1 | $ lsof-i tcp:3000 |
注意,
使用 kill
命令发送信号给该进程。通常可以使用 kill -9 <进程ID>
强制终止进程。
1 | sudo kill -9 12345 |
警告: 使用 kill -9
是强制终止,不推荐在生产环境中使用,因为它可能导致数据丢失或者进程状态异常。应该优先尝试使用 kill <进程ID>
发送 SIGTERM 信号,让进程优雅关闭。
在Windows10上
1 | netstat-ano | findstr:3000 |
在git bash中将tskill更改为taskkill
2. 通过npx命令来关闭
1 | npx kill-port 3000 |
如果需要关闭多个进程,则可以通过空格来分割:
1 | npx kill-port 3000 8080 4200 |
3. 通过GUI来关闭(win)
4. 如何防止端口被占用
- 规划: 在部署服务之前,仔细规划端口使用,避免冲突。
- 监控: 定期监控端口使用情况,及时发现问题。
- 使用 netstat -apn 监控所有连接: 使用 sudo netstat -apn 查看所有正在使用的端口号,并识别哪些程序正在占用端口,可以帮助你发现潜在的问题。
- 自动化脚本: 使用自动化脚本来启动和停止服务,确保端口使用的正确性。
- Docker compose: 使用 docker compose 来管理多容器应用,可以避免端口冲突。