定时检查服务并重启脚本

wen 实用脚本 1

本文目录导读:

定时检查服务并重启脚本

  1. 使用方法
  2. 扩展版本(支持多个服务)
  3. 注意事项
  4. 发送邮件通知的扩展
#!/bin/bash
# ====================================================
# 服务健康检查与自动重启脚本
# 功能:定时检查指定服务是否运行,若未运行则尝试重启
# 用法:配合 cron 定时任务使用
# ====================================================
# 需要监控的服务名称(systemd 服务名)
SERVICE_NAME="nginx"
# 日志文件路径
LOG_FILE="/var/log/service_check.log"
# 重启尝试次数
MAX_RETRIES=3
# 重启间隔(秒)
RETRY_INTERVAL=5
# ====================================================
# 函数:记录日志
# ====================================================
log_message() {
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[${timestamp}] $1" >> "${LOG_FILE}"
    echo "[${timestamp}] $1"
}
# ====================================================
# 函数:检查服务是否运行
# ====================================================
check_service() {
    if systemctl is-active --quiet "${SERVICE_NAME}"; then
        return 0  # 服务正在运行
    else
        return 1  # 服务未运行
    fi
}
# ====================================================
# 函数:重启服务
# ====================================================
restart_service() {
    local retry_count=0
    while [ ${retry_count} -lt ${MAX_RETRIES} ]; do
        log_message "尝试重启服务 ${SERVICE_NAME} (第 $((retry_count+1)) 次)"
        systemctl restart "${SERVICE_NAME}"
        # 等待服务启动
        sleep ${RETRY_INTERVAL}
        # 检查是否成功启动
        if check_service; then
            log_message "服务 ${SERVICE_NAME} 重启成功"
            return 0
        else
            retry_count=$((retry_count+1))
            log_message "服务重启失败,等待 ${RETRY_INTERVAL} 秒后重试"
        fi
    done
    log_message "错误:服务 ${SERVICE_NAME} 在 ${MAX_RETRIES} 次尝试后仍无法启动"
    return 1
}
# ====================================================
# 主逻辑
# ====================================================
main() {
    log_message "开始检查服务 ${SERVICE_NAME} 状态"
    if check_service; then
        log_message "服务 ${SERVICE_NAME} 运行正常"
        return 0
    else
        log_message "警告:服务 ${SERVICE_NAME} 未运行,准备重启"
        restart_service
    fi
}
# 执行主函数
main

使用方法

保存脚本

保存为 service_monitor.sh

sudo nano /usr/local/bin/service_monitor.sh

赋予执行权限

sudo chmod +x /usr/local/bin/service_monitor.sh

修改配置

根据实际需要修改脚本顶部的配置变量:

  • SERVICE_NAME:要监控的服务名称(systemd 服务名)
  • LOG_FILE:日志文件路径
  • MAX_RETRIES:最大重启尝试次数
  • RETRY_INTERVAL:重启尝试间隔(秒)

测试脚本

# 直接运行一次
sudo /usr/local/bin/service_monitor.sh
# 查看日志
sudo tail -f /var/log/service_check.log

设置定时任务

使用 cron 设置定期检查(例如每 5 分钟检查一次):

sudo crontab -e

添加以下行:

*/5 * * * * /usr/local/bin/service_monitor.sh

其他常见间隔示例:

# 每分钟检查
* * * * * /usr/local/bin/service_monitor.sh
# 每 10 分钟检查
*/10 * * * * /usr/local/bin/service_monitor.sh
# 每小时检查
0 * * * * /usr/local/bin/service_monitor.sh

扩展版本(支持多个服务)

如果需要监控多个服务,可以使用以下扩展版本:

#!/bin/bash
# ====================================================
# 多服务健康检查与自动重启脚本
# ====================================================
# 需要监控的服务列表(空格分隔)
SERVICES=("nginx" "mysql" "redis")
# 日志文件
LOG_FILE="/var/log/service_monitor.log"
# 重启配置
MAX_RETRIES=3
RETRY_INTERVAL=5
log_message() {
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[${timestamp}] $1" >> "${LOG_FILE}"
    echo "[${timestamp}] $1"
}
check_service() {
    local service=$1
    if systemctl is-active --quiet "${service}"; then
        return 0
    else
        return 1
    fi
}
restart_service() {
    local service=$1
    local retry_count=0
    while [ ${retry_count} -lt ${MAX_RETRIES} ]; do
        log_message "尝试重启服务 ${service} (第 $((retry_count+1)) 次)"
        systemctl restart "${service}"
        sleep ${RETRY_INTERVAL}
        if check_service "${service}"; then
            log_message "服务 ${service} 重启成功"
            return 0
        else
            retry_count=$((retry_count+1))
            log_message "服务重启失败,等待 ${RETRY_INTERVAL} 秒后重试"
        fi
    done
    log_message "错误:服务 ${service} 在 ${MAX_RETRIES} 次尝试后仍无法启动"
    return 1
}
main() {
    log_message "===== 开始服务健康检查 ====="
    for service in "${SERVICES[@]}"; do
        log_message "检查服务: ${service}"
        if check_service "${service}"; then
            log_message "服务 ${service} 运行正常"
        else
            log_message "警告:服务 ${service} 未运行,准备重启"
            restart_service "${service}"
        fi
    done
    log_message "===== 服务检查完成 ====="
}
main

注意事项

  1. 权限:脚本需要 root 权限才能执行 systemctl 命令
  2. 日志轮转:建议配置 logrotate 管理日志文件,避免日志过大
  3. 服务依赖:确保被监控的服务已配置为 systemd 服务
  4. 测试环境:先在测试环境验证脚本功能
  5. 邮件通知:可以扩展脚本加入邮件告警功能(如发送到管理员邮箱)

发送邮件通知的扩展

如果需要邮件通知,可以在脚本中添加:

# 在脚本开头添加邮件配置
ADMIN_EMAIL="admin@example.com"
# 在 restart_service 函数失败时发送邮件
log_message "错误:服务 ${SERVICE_NAME} 在 ${MAX_RETRIES} 次尝试后仍无法启动"
echo "服务 ${SERVICE_NAME} 在 $(date) 重启失败" | mail -s "服务重启失败通知" ${ADMIN_EMAIL}

这个脚本可以满足大多数服务监控和自动重启的需求,根据实际环境调整配置即可。

抱歉,评论功能暂时关闭!