插件窝 干货文章 Linux下mongodb服务监视脚本怎么写

Linux下mongodb服务监视脚本怎么写

MongoDB MONGO 重启 服务 71    来源:    2025-04-21

MongoDB 服务监视脚本(Linux)

以下是一个完整的 MongoDB 服务监视脚本,可以检查 MongoDB 是否运行,并在服务停止时自动重启。

基础监视脚本

#!/bin/bash

# MongoDB 监视脚本
# 功能:检查 MongoDB 是否运行,如果停止则自动重启

# 配置部分
MONGO_SERVICE="mongod"    # 服务名称(根据你的系统可能是 mongod 或 mongodb)
MONGO_PORT=27017         # MongoDB 默认端口
MONGO_HOST="localhost"    # MongoDB 主机地址
LOG_FILE="/var/log/mongo_monitor.log"  # 日志文件路径

# 检查 MongoDB 是否运行
check_mongo() {
    # 方法1:检查端口是否监听
    nc -z $MONGO_HOST $MONGO_PORT > /dev/null 2>&1
    PORT_STATUS=$?

    # 方法2:检查服务进程
    pgrep -f $MONGO_SERVICE > /dev/null 2>&1
    PROCESS_STATUS=$?

    # 方法3:检查服务状态(systemd系统)
    if command -v systemctl > /dev/null; then
        systemctl is-active --quiet $MONGO_SERVICE
        SERVICE_STATUS=$?
    else
        SERVICE_STATUS=0  # 如果不是systemd系统则跳过
    fi

    # 如果任一检查失败,则认为服务停止
    if [ $PORT_STATUS -ne 0 ] || [ $PROCESS_STATUS -ne 0 ] || [ $SERVICE_STATUS -ne 0 ]; then
        return 1
    else
        return 0
    fi
}

# 重启 MongoDB 服务
restart_mongo() {
    echo "$(date) - MongoDB 服务停止,尝试重启..." >> $LOG_FILE

    if command -v systemctl > /dev/null; then
        systemctl restart $MONGO_SERVICE >> $LOG_FILE 2>&1
    else
        service $MONGO_SERVICE restart >> $LOG_FILE 2>&1
    fi

    # 等待几秒让服务完全启动
    sleep 5

    # 检查重启是否成功
    check_mongo
    if [ $? -eq 0 ]; then
        echo "$(date) - MongoDB 服务重启成功" >> $LOG_FILE
        return 0
    else
        echo "$(date) - 错误:MongoDB 服务重启失败" >> $LOG_FILE
        return 1
    fi
}

# 主循环
while true; do
    check_mongo
    if [ $? -ne 0 ]; then
        restart_mongo
        if [ $? -ne 0 ]; then
            # 重启失败,发送警报(可选)
            echo "$(date) - 警报:MongoDB 服务无法启动!" >> $LOG_FILE
            # 这里可以添加邮件通知或其他警报机制
        fi
    fi

    # 每隔60秒检查一次
    sleep 60
done

高级版本(带通知功能)

#!/bin/bash

# 高级 MongoDB 监视脚本
# 功能:监视 MongoDB,自动重启,发送邮件通知,记录详细日志

# 配置部分
MONGO_SERVICE="mongod"
MONGO_PORT=27017
MONGO_HOST="localhost"
LOG_FILE="/var/log/mongo_monitor.log"
MAX_RETRIES=3               # 最大重试次数
ALERT_EMAIL="admin@example.com"  # 警报邮件接收地址
CHECK_INTERVAL=60           # 检查间隔(秒)

# 初始化日志
init_log() {
    touch $LOG_FILE
    echo "$(date) - MongoDB 监视脚本启动" >> $LOG_FILE
}

# 发送邮件通知
send_alert() {
    local subject=$1
    local message=$2

    if command -v mail > /dev/null; then
        echo "$message" | mail -s "$subject" $ALERT_EMAIL
    else
        echo "$(date) - 警告:无法发送邮件警报,mail 命令不可用" >> $LOG_FILE
    fi
}

# 检查 MongoDB 是否运行
check_mongo() {
    # 尝试连接并执行简单命令
    if mongo --host $MONGO_HOST --port $MONGO_PORT --eval "db.adminCommand('ping')" > /dev/null 2>&1; then
        return 0
    else
        return 1
    fi
}

# 重启 MongoDB 服务
restart_mongo() {
    local retry_count=0

    while [ $retry_count -lt $MAX_RETRIES ]; do
        echo "$(date) - 尝试重启 MongoDB (尝试 $((retry_count+1))/$MAX_RETRIES)..." >> $LOG_FILE

        if command -v systemctl > /dev/null; then
            systemctl restart $MONGO_SERVICE >> $LOG_FILE 2>&1
        else
            service $MONGO_SERVICE restart >> $LOG_FILE 2>&1
        fi

        sleep 5  # 等待服务启动

        check_mongo
        if [ $? -eq 0 ]; then
            echo "$(date) - MongoDB 重启成功" >> $LOG_FILE
            send_alert "MongoDB 恢复通知" "MongoDB 服务已成功重启。"
            return 0
        fi

        retry_count=$((retry_count+1))
    done

    echo "$(date) - 错误:无法重启 MongoDB 服务" >> $LOG_FILE
    send_alert "MongoDB 服务故障" "无法重启 MongoDB 服务,请手动检查!"
    return 1
}

# 主程序
main() {
    init_log

    while true; do
        check_mongo
        if [ $? -ne 0 ]; then
            echo "$(date) - 检测到 MongoDB 服务停止" >> $LOG_FILE
            send_alert "MongoDB 服务停止" "检测到 MongoDB 服务已停止,正在尝试重启..."

            restart_mongo
            if [ $? -ne 0 ]; then
                # 重启失败,等待更长时间再重试
                sleep 300
            fi
        fi

        sleep $CHECK_INTERVAL
    done
}

# 启动主程序
main

使用说明

  1. 将脚本保存为 /usr/local/bin/mongo_monitor.sh
  2. 添加执行权限:chmod +x /usr/local/bin/mongo_monitor.sh
  3. 配置为系统服务(可选):

创建 systemd 服务文件 /etc/systemd/system/mongo-monitor.service

[Unit]
Description=MongoDB Monitor Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mongo_monitor.sh
Restart=always
User=root

[Install]
WantedBy=multi-user.target

然后启用并启动服务:

systemctl daemon-reload
systemctl enable mongo-monitor
systemctl start mongo-monitor

注意事项

  1. 根据你的系统调整 MONGO_SERVICE 名称(可能是 mongod 或 mongodb)
  2. 确保脚本有权限重启 MongoDB 服务(通常需要 root 权限)
  3. 邮件通知功能需要系统已安装邮件客户端(如 mailutils)
  4. 对于生产环境,建议使用专业的监控工具如 Nagios、Zabbix 或 Prometheus 来监控 MongoDB

这个脚本提供了基本的监视和自动恢复功能,可以根据你的具体需求进行修改和扩展。