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 ""