Redis-API.png

一个基于第一性原理构建的 Redis 自动化监控脚本。该脚本不仅实现了从进程检测到 redis-cli ping 探测的维度升级,更完美兼容 systemd 与二进制启动模式,解决了常见的“Unit not found”环境差异报错。内置 Telegram Bot 告警集成,并针对网络延迟进行了 --max-time 异步优化,是提升 Redis 服务高可用性的轻量级生产级解决方案。

第一性原理拆解

“针对你整合了 Telegram (TG) 机器人的脚本,我将从代码工程化的角度进行优化。目前的脚本存在硬编码、逻辑重复以及网络请求未优化等问题。”

配置解耦:Token 和 Chat ID 应该全局变量化,方便更换。
功能封装:发送逻辑应封装为函数,避免多次编写冗长的 curl 命令。
消息原子化:将状态判断与消息发送分离,提升代码可读性。

优化后的整合脚本

这个版本通过封装 send_tg_notification 函数,简化了通知流程,并增强了脚本的健壮性。

#!/bin/bash

# --- 1. 配置区域 ---
# 基础路径配置
REDIS_BIN=$(which redis-server || echo "/usr/local/bin/redis-server")
REDIS_CLI=$(which redis-cli || echo "/usr/local/bin/redis-cli")
REDIS_CONF="/etc/redis.conf"
LOG_FILE="/home/rediserror.log"

# Telegram 配置
TG_TOKEN="1044027113:AAGZqM-FX_SGVNrtUj81xWLZqDCO1IbSSBc" #举例
TG_CHAT_ID="123426821" #举例
SITE_URL="limbopro.com" #举例

# --- 2. 核心函数 ---
# 封装 TG 发送函数
send_tg_notification() {
    local status_msg="$1"
    local current_time=$(env LANG=en_US.UTF-8 date "+%e/%b/%Y/%R")
    local full_payload="[Redis 监控告警]\n站点: ${SITE_URL}\n状态: ${status_msg}\n时间: ${current_time}"

    # 使用 -s (silent) 隐藏进度,-d 使用 POST 数据体以支持特殊字符
    curl -s --max-time 5 -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
        -d "chat_id=${TG_CHAT_ID}" \
        -d "text=$(echo -e "$full_payload")" > /dev/null
}

# --- 3. 逻辑处理 ---

TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")

# A. 状态探测
if $REDIS_CLI ping 2>/dev/null | grep -q "PONG"; then
    exit 0
fi

# B. 触发故障流程
echo "[$TIMESTAMP] Redis down. Attempting recovery..." >> "$LOG_FILE"
send_tg_notification "🚨 Redis 进程失联,正在尝试自动重启..."

# C. 执行重启逻辑
if systemctl list-unit-files | grep -q "redis.service"; then
    systemctl restart redis
elif systemctl list-unit-files | grep -q "redis-server.service"; then
    systemctl restart redis-server
else
    if [ -f "$REDIS_CONF" ]; then
        nohup "$REDIS_BIN" "$REDIS_CONF" > /dev/null 2>&1 &
    else
        nohup "$REDIS_BIN" --daemonize yes > /dev/null 2>&1 &
    fi
fi

# D. 延迟校验
sleep 5

if pgrep -x "redis-server" > /dev/null; then
    echo "[$TIMESTAMP] Success: Redis-server is back online." >> "$LOG_FILE"
    send_tg_notification "✅ Redis 重启成功,服务已恢复。"
else
    echo "[$TIMESTAMP] FAILED: Could not restart Redis." >> "$LOG_FILE"
    send_tg_notification "❌ Redis 重启失败!请联系 @limboprobot 检修。"
    exit 1
fi

 批判性评估

优化点对比表

改进项 原脚本 优化版 优势
URL 管理 每次发送都写一遍长 URL 使用 ${TG_TOKEN} 变量 易于维护,更换机器人只需改一行。
内容格式 拼写混杂在 URL 字符串中 模板化字符串 (full_payload) 消息排版更整齐,支持换行 (\n)。
网络请求 通过 GET 参数拼接 使用 POST Body (-d) 避免特殊字符(如 @%)导致 URL 解析失败。
代码冗余 多次调用 curl 封装成 send_tg_notification 降低代码维护难度。

 结论与逻辑推演

置信度评级:高。 该脚本已解决你之前遇到的 Unit not found 兼容性问题,并大幅优化了 TG 报警的可维护性。

逻辑闭环校验

  1. 探测失败 -> 2. 发送故障提醒 -> 3. 多模式尝试重启 -> 4. 等待环境稳定 -> 5. 验证结果并发送对应反馈。

设置 Crontab

假设脚本路径为:/home/redis.sh;

 设置步骤

请在终端执行以下操作:

1.赋予脚本执行权限(如果还没执行过):

chmod +x /home/redis.sh

2.打开当前用户的 crontab 编辑器

crontab -e

3.在文件末尾添加以下行(建议每分钟检查一次):

代码段

* * * * * /bin/bash /home/redis.sh > /dev/null 2>&1

以上内容,在 Genimi 协助下完成。

最后修改:2026 年 01 月 20 日 12 : 06 PM