文章目录
- [MongoDB 设置开机自启](#MongoDB 设置开机自启)
-
- [1. MongoDB 设置开机自启的步骤](#1. MongoDB 设置开机自启的步骤)
-
- 第一步:确认配置文件中的关键路径
- [第二步:停止当前运行的 MongoDB 进程](#第二步:停止当前运行的 MongoDB 进程)
- [第三步:创建 systemd service 文件](#第三步:创建 systemd service 文件)
- [第四步:重载 systemd 并启动](#第四步:重载 systemd 并启动)
- 第五步:验证
- [2. MongoDB 设置开机自启踩坑记](#2. MongoDB 设置开机自启踩坑记)
-
- [踩坑一:明明是 root 账号,systemctl 启动却失败](#踩坑一:明明是 root 账号,systemctl 启动却失败)
- [踩坑二:服务器重启后 MongoDB 自动启动失败](#踩坑二:服务器重启后 MongoDB 自动启动失败)
- 常见问题速查
MongoDB 设置开机自启
1. MongoDB 设置开机自启的步骤
环境信息:
- 操作系统:CentOS Linux 7.6.1810
- MongoDB 二进制路径:
/usr/bin/mongod - 配置文件路径:
/etc/mongod.conf
第一步:确认配置文件中的关键路径
bash
grep -E "path|dbPath|pidFilePath|logPath|fork" /etc/mongod.conf
示例输出:
yaml
path: /var/log/mongodb/mongod.log
dbPath: /var/lib/mongo
pidFilePath: /var/run/mongodb/mongod.pid
fork: true
第二步:停止当前运行的 MongoDB 进程
bash
# 优雅停止进程
pkill -TERM mongod
sleep 3
# 确认已停止
ps -ef | grep mongod | grep -v grep
# 清理残留 PID 文件
rm -f /var/run/mongodb/mongod.pid
第三步:创建 systemd service 文件
bash
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 并启动
bash
# 重载 systemd 配置
systemctl daemon-reload
# 设置开机自启
systemctl enable mongod
# 启动服务
systemctl start mongod
第五步:验证
bash
# 查看服务状态
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 登录服务器,手动执行以下命令可以正常启动:
bash
/usr/bin/mongod -f /etc/mongod.conf
# child process started successfully, parent exiting
但通过 systemctl 启动就失败:
bash
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 用户来执行启动命令:
bash
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:
ini
[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 |