MongoDB 设置开机自启

文章目录

  • [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
相关推荐
李少兄2 小时前
如何创建MySQL索引
数据库·mysql
2201_761040592 小时前
CSS如何根据父级容器宽度调整子项_利用容器查询container选择器css
jvm·数据库·python
uNke DEPH2 小时前
Redis 安装及配置教程(Windows)【安装】
数据库·windows·redis
weixin_458580122 小时前
如何在 Python Fabric 中正确执行 EdgeOS 配置命令
jvm·数据库·python
m0_737539372 小时前
mysql的理论和使用
数据库·mysql
ZC跨境爬虫2 小时前
3D地球卫星轨道可视化平台开发 Day15(添加卫星系列模糊搜索功能)
前端·数据库·3d·交互·数据可视化
tjc199010052 小时前
SQL中如何处理GROUP BY的不可排序问题_ORDERBY与聚合
jvm·数据库·python
JoshRen2 小时前
Python使用PyMySQL操作MySQL完整指南
数据库·python·mysql
2601_949816222 小时前
MySQL 启动失败 (code=exited, status=1FAILURE) 异常解决方案
数据库·mysql