
序
一个基于第一性原理构建的 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 报警的可维护性。
逻辑闭环校验:
- 探测失败 -> 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 协助下完成。
版权属于:毒奶
联系我们:https://limbopro.com/6.html
毒奶搜索:https://limbopro.com/search.html
番号搜索:https://limbopro.com/btsearch.html
机场推荐:https://limbopro.com/865.html IEPL专线/100Gb/¥15/月起(最高享8折优惠)
毒奶导航:https://limbopro.com/daohang/index.html本文链接:https://limbopro.com/archives/34896.html · 镜像:https://limbopro.github.io/archives/34896.html
本文采用 CC BY-NC-SA 4.0 许可协议,转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!




