以下是一个完整的 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
/usr/local/bin/mongo_monitor.sh
chmod +x /usr/local/bin/mongo_monitor.sh
创建 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
MONGO_SERVICE
名称(可能是 mongod 或 mongodb)这个脚本提供了基本的监视和自动恢复功能,可以根据你的具体需求进行修改和扩展。