MongoDB 4.4 启动报 Code 48 通常表示端口被占用,最推荐的处理方向是检查 27017 端口占用进程并清理,适用场景为服务无法正常启动,风险边界是误杀其他业务进程。
先说结论:Code 48 对应系统错误 EADDRINUSE,意味着 MongoDB 尝试绑定的端口已被其他进程占用,需释放端口或修改配置。
- 先确认:使用网络命令查看 27017 端口占用情况
- 先处理:停止占用端口的进程或修改 MongoDB 配置端口
- 再验证:查看 MongoDB 日志确认启动成功且无报错
命令速用版
以下命令用于快速定位占用端口的进程并终止,适用于 Linux 环境:
ss -tlnp | grep 27017
kill -9 <PID>
systemctl start mongod
为什么会这样
Code 48 错误本质是操作系统返回的“地址已被使用”信号。
当 MongoDB 尝试监听默认端口 27017 时,如果该端口已被另一个 mongod 实例或其他服务占用,操作系统会拒绝绑定请求并返回 errno 48(macOS 常见)或 98(Linux 常见),MongoDB 日志中会记录为 Address already in use。
分步处理
按顺序执行以下步骤,每步完成后检查状态:
- 检查端口占用:运行
ss -tlnp | grep 27017或netstat -tlnp | grep 27017,确认是否有进程监听该端口。 - 停止占用进程:如果发现有僵尸 mongod 进程,记录 PID 并执行
kill -9 <PID>终止。 - 清理锁文件:如果端口未占用但仍报错,检查数据目录下的
mongod.lock文件,非正常关机后需手动删除。 - 修改配置端口:若端口必须被其他服务占用,编辑
/etc/mongod.conf,修改net.port为其他值。
怎么验证是否生效
执行systemctl status mongod查看服务状态为 active (running),且日志文件/var/log/mongodb/mongod.log中最后几行显示 waiting for connections。
常见坑
- 直接删除
mongod.lock前需确保没有 mongod 进程在运行,否则可能导致数据损坏。 - 绑定 1024 以下端口需要 root 权限,普通用户启动会报权限错误而非端口占用。
- 容器环境下端口映射冲突也会引发此报错,需检查 Docker 端口配置。
常见问题
删除 lock 文件会导致数据丢失吗?
不会直接导致数据丢失,但需确保进程已完全停止。
如何修改 MongoDB 默认端口?
在配置文件中设置 net.port 参数并重启服务。
重启服务器能解决 Code 48 吗?
能,重启会清理所有进程和锁文件,但生产环境需谨慎。
参考来源
- MongoDB Official Documentation, Troubleshooting, https://www.mongodb.com/docs/manual/troubleshooting/