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 << 'eof' [unit] description=mongodb server after=network.target [service] type=forking runtimedirectory=mongodb runtimedirectorymode=0755 pidfile=/var/run/mongodb/mongod.pid execstart=/usr/bin/mongod -f /etc/mongod.conf execreload=/bin/kill -hup $mainpid execstop=/bin/kill -term $mainpid restart=always restartsec=5 [install] wantedby=multi-user.target eof
关键配置说明:
| 配置项 | 值 | 说明 |
|---|---|---|
| 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 |
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论