1. MongoDB 设置开机自启的步骤
环境信息:
- 操作系统:CentOS Linux 7.6.1810
- MongoDB 二进制路径:
/usr/bin/mongod - 配置文件路径:
/etc/mongod.conf
第一步:确认配置文件中的关键路径
grep -E "path|dbPath|pidFilePath|logPath|fork" /etc/mongod.conf
示例输出:
path: /var/log/mongodb/mongod.log dbPath: /var/lib/mongo pidFilePath: /var/run/mongodb/mongod.pid fork: true
第二步:停止当前运行的 MongoDB 进程
# 优雅停止进程 pkill -TERM mongod sleep 3 # 确认已停止 ps -ef | grep mongod | grep -v grep # 清理残留 PID 文件 rm -f /var/run/mongodb/mongod.pid
第三步:创建 systemd service 文件
cat > /etc/systemd/system/mongod.service
关键配置说明:
| 配置项 | 值 | 说明 |
|---|---|---|
| Type | forking | mongod.conf 中 fork: true 时必须使用 |
| RuntimeDirectory | mongodb | 每次启动前自动创建 /run/mongodb/ 目录 |
| RuntimeDirectoryMode | 0755 | 自动创建目录的权限 |
| PIDFile | /var/run/mongodb/mongod.pid | 与 mongod.conf 中 pidFilePath 保持一致 |
| Restart | always | 进程意外退出后自动重启 |
| RestartSec | 5 | 重启等待间隔秒数 |
第四步:重载 systemd 并启动
# 重载 systemd 配置 systemctl daemon-reload # 设置开机自启 systemctl enable mongod # 启动服务 systemctl start mongod
第五步:验证
# 查看服务状态
systemctl status mongod
# 确认开机自启已启用
systemctl is-enabled mongod
# 确认进程正常运行
ps -ef | grep mongod | grep -v grep
# 测试连接
mongo --eval "db.adminCommand('ping')"
成功输出:
● mongod.service - MongoDB Server Loaded: loaded (/etc/systemd/system/mongod.service; enabled; vendor preset: disabled) Active: active (running) since 一 2026-04-20 17:30:00 CST; 5s ago
2. MongoDB 设置开机自启踩坑记
踩坑一:明明是 root 账号,systemctl 启动却失败
现象
以 root 登录服务器,手动执行以下命令可以正常启动:
/usr/bin/mongod -f /etc/mongod.conf # child process started successfully, parent exiting
但通过 systemctl 启动就失败:
systemctl start mongod # Job for mongod.service failed because the control process exited with error code.
日志显示:
runuser[9131]: session opened for user mongod by (uid=0) runuser[9131]: session closed for user mongod mongod[9120]: Starting mongod: [失败]
原因
系统中存在 /etc/rc.d/init.d/mongod(旧式 SysV 初始化脚本),systemctl 实际调用的是这个脚本。
而脚本内部会通过 runuser 自动切换到 mongod 用户来执行启动命令:
runuser -s /bin/bash mongod -c "/usr/bin/mongod -f /etc/mongod.conf"
整个流程如下:
你(root)→ systemctl start mongod
→ 调用 /etc/rc.d/init.d/mongod
→ runuser 切换到 mongod 用户
→ mongod 用户无写权限
→ 启动失败
手动执行时是以 root 身份运行,绕过了用户切换,所以成功。
解决方案
在 /etc/systemd/system/ 下创建 native systemd service 文件。
该目录优先级高于 SysV init 脚本,systemd 会直接使用新文件,不再调用 init.d 脚本,也不再切换用户。
踩坑二:服务器重启后 MongoDB 自动启动失败
现象
按照踩坑一的方案配置好后,systemctl start mongod 可以正常启动,systemctl enable mongod 也已设置开机自启。
但重启服务器后,MongoDB 没有自动启动,查看日志:
Error starting mongod. /var/run/mongodb/mongod.pid exists.
或者:
mongod: Starting mongod: [失败]
原因
/var/run 在 CentOS 7 中是指向 /run 的软链接,而 /run 是挂载在内存中的 tmpfs 临时文件系统:
服务器关机 → 内存清空 → /run (tmpfs) 全部消失
服务器开机 → /run 重新挂载为空目录
→ /var/run/mongodb/ 目录不存在
→ mongod 无法写入 PID 文件
→ 启动失败
注意与手动删除 pid 文件的区别:手动删除只是删除文件,/var/run/mongodb/ 目录还在;重启后连目录本身都消失了。
解决方案
在 service 文件的 [Service] 段中添加 RuntimeDirectory=mongodb:
[Service] RuntimeDirectory=mongodb RuntimeDirectoryMode=0755
RuntimeDirectory 是 systemd 的内置指令,会在每次启动服务之前自动创建 /run/mongodb/ 目录,服务停止后自动清理,完全不需要手动干预,从根本上解决重启后目录丢失的问题。
常见问题速查
| 现象 | 原因 | 解决 |
|---|---|---|
| Starting mongod: [失败],日志有 runuser | SysV init 脚本切换用户失败 | 创建 native systemd service 文件 |
| 重启后 MongoDB 未自动启动,PID 目录不存在 | /var/run 是 tmpfs,重启后清空 | service 文件中添加 RuntimeDirectory=mongodb |
| 启动报错 mongod.pid exists | 上次异常退出残留 PID 文件 | rm -f /var/run/mongodb/mongod.pid |
| systemctl stop mongod 停不掉 | service 文件缺少 PIDFile | 补充 PIDFile 配置后 daemon-reload |
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。
