定时检查并重启崩溃服务脚本

wen 实用脚本 1

本文目录导读:

定时检查并重启崩溃服务脚本

  1. 使用说明
  2. 作为系统服务运行(更稳健)
  3. 注意事项
  4. 自定义扩展
#!/bin/bash
# ============================================================
# 定时检查并重启崩溃服务脚本
# 功能:监控指定系统服务,当服务停止时自动重启并记录日志
# 使用:根据需求修改 SERVICE_NAME 和 INTERVAL 变量
# ============================================================
# ---------- 配置区域(请根据实际需求修改) ----------
SERVICE_NAME="your-service-name"        # 要监控的服务名称(如 nginx, mysql 等)
INTERVAL=60                              # 检查间隔时间(秒),建议至少 30 秒
LOG_FILE="/var/log/service_monitor.log" # 日志文件路径(确保脚本有写入权限)
# ---------------------------------------------------------
# 检查是否以 root 权限运行(因为 systemctl restart 常需 root)
if [[ $EUID -ne 0 ]]; then
   echo "错误:本脚本需要 root 权限才能重启服务,请使用 sudo 运行。"
   exit 1
fi
# 创建日志函数(带时间戳)
log_message() {
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] $1" | tee -a "$LOG_FILE"
}
# 检查所需命令是否存在
for cmd in systemctl grep tee; do
    if ! command -v $cmd &> /dev/null; then
        echo "错误:命令 '$cmd' 未找到,请先安装。"
        exit 1
    fi
done
# 检查服务是否存在
if ! systemctl list-units --type=service --all | grep -q "$SERVICE_NAME.service"; then
    log_message "错误:服务 '$SERVICE_NAME' 不存在,请检查服务名称。"
    exit 1
fi
log_message "服务监控脚本启动"
log_message "监控服务: $SERVICE_NAME, 检查间隔: ${INTERVAL}秒"
log_message "日志文件: $LOG_FILE"
echo "----------------------------------------"
# 主循环
while true; do
    # 获取服务状态(排除 grep 自身)
    if systemctl is-active --quiet "$SERVICE_NAME"; then
        # 服务正常运行,不记录日志以免日志膨胀
        # 如需调试可以取消下面注释
        # log_message "服务 '$SERVICE_NAME' 运行正常"
        :
    else
        # 服务未运行,尝试重启
        log_message "警告:服务 '$SERVICE_NAME' 已停止!尝试重启..."
        # 执行重启操作
        if systemctl restart "$SERVICE_NAME" 2>&1; then
            log_message "成功:服务 '$SERVICE_NAME' 已重启"
            # 可选:等待几秒后再次检查重启是否生效
            sleep 3
            if systemctl is-active --quiet "$SERVICE_NAME"; then
                log_message "确认:服务 '$SERVICE_NAME' 重启后正常运行"
            else
                log_message "严重:服务 '$SERVICE_NAME' 重启后仍未运行,请手动检查!"
            fi
        else
            log_message "失败:无法重启服务 '$SERVICE_NAME',请手动检查错误"
        fi
    fi
    # 等待指定间隔后再次检查
    sleep "$INTERVAL"
done

使用说明

  1. 配置脚本

    • SERVICE_NAME 改为您要监控的服务名称(如 nginxmysqlsshd 等)
    • 调整 INTERVAL 检查间隔(单位:秒)
    • 修改 LOG_FILE 日志路径(确保目录存在且有写入权限)
  2. 授予执行权限

    chmod +x service_monitor.sh
  3. 运行脚本(需要 root 权限)

    sudo ./service_monitor.sh
  4. 后台运行(推荐)

    sudo nohup ./service_monitor.sh &

    或使用 screen / tmux 保持会话。

作为系统服务运行(更稳健)

  1. 将脚本移动到 /usr/local/bin/

    sudo cp service_monitor.sh /usr/local/bin/
  2. 创建 systemd 服务文件 /etc/systemd/system/service-monitor.service

    [Unit]
    Description=Service Monitor - Auto restart crashed services
    After=network.target
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/service_monitor.sh
    Restart=always
    RestartSec=30
    User=root
    [Install]
    WantedBy=multi-user.target
  3. 启用并启动服务:

    sudo systemctl daemon-reload
    sudo systemctl enable service-monitor.service
    sudo systemctl start service-monitor.service

注意事项

  • 日志管理:长时间运行会导致日志文件增大,建议配置 logrotate 进行日志轮转。
  • 服务依赖:重启服务时,请确保其依赖的其他服务正常运行。
  • 重启策略:如果服务频繁崩溃,脚本会不断尝试重启,可能造成系统资源消耗,建议同时排查服务崩溃的根本原因。
  • 非 systemd 系统:如果您的系统不使用 systemd(如旧版 SysV init),请将脚本中的 systemctl 替换为对应的管理命令(如 service)。

自定义扩展

您可以按需在脚本中添加:

  • 邮件/钉钉/企业微信通知(崩溃时)
  • 最大重启次数限制(防止无限重启)
  • 检查特定进程而非 systemd 服务
  • 健康检查(如 HTTP 端口检测)

如果需要其他自定义功能,欢迎提出!

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