Shell服务状态监控与自动重启脚本

代码脚本 · 基础巡检

监控指定服务运行状态,异常时自动重启并发送邮件告警,保证服务高可用。

详细内容

#!/bin/bash # 服务状态监控与自动重启脚本 # 使用方法: 修改配置后 bash service_monitor.sh # 配合cron每分钟执行: * * * * * /path/to/service_monitor.sh # ========== 配置区 ========== SERVICES=("nginx" "mysql" "docker") # 要监控的服务 ALERT_EMAIL="admin@example.com" # 告警邮箱 LOG_FILE="/var/log/service_monitor.log" MAX_RESTART=3 # 最大重启次数 RESTART_INTERVAL=60 # 重启间隔(秒) # ============================ # 日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE } # 发送告警邮件 send_alert() { local service=$1 local action=$2 local detail=$3 local subject="【服务告警】$service $action" local body="服务名称: $service 告警时间: $(date '+%Y-%m-%d %H:%M:%S') 主机名: $(hostname) 详情: $detail" echo "$body" | mail -s "$subject" $ALERT_EMAIL 2>/dev/null log "告警邮件已发送: $subject" } # 检查服务状态 check_service() { local service=$1 if systemctl is-active --quiet $service 2>/dev/null; then return 0 # 运行中 else return 1 # 未运行 fi } # 重启服务 restart_service() { local service=$1 local count=0 while [ $count -lt $MAX_RESTART ]; do log "尝试第 $((count+1)) 次重启 $service..." systemctl restart $service sleep 5 if check_service $service; then log "✅ $service 重启成功" send_alert $service "已自动重启" "服务异常,已自动重启成功" return 0 fi count=$((count + 1)) sleep $RESTART_INTERVAL done log "❌ $service 重启失败(已尝试 $MAX_RESTART 次)" send_alert $service "重启失败" "连续 $MAX_RESTART 次重启失败,请人工检查!" return 1 } # 主逻辑 log "========================================" log "服务监控开始" log "监控服务: ${SERVICES[*]}" log "========================================" for service in "${SERVICES[@]}"; do if check_service $service; then log "✅ $service 运行正常" else log "⚠️ $service 未运行,准备重启..." restart_service $service fi done # 检查磁盘空间(可选) disk_usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//') if [ $disk_usage -gt 90 ]; then log "⚠️ 磁盘空间不足: ${disk_usage}%" send_alert "磁盘" "空间不足" "根分区使用率 ${disk_usage}%,请及时清理" fi log "服务监控结束" log ""
Shell服务监控自动重启告警高可用

更多基础巡检