本文目录导读:

我来为您编写一个Redis连接状态巡检脚本,包含多种检测方式:
基础版 - Redis连接检测脚本
#!/bin/bash
# Redis连接状态巡检脚本
# 使用方法: ./check_redis.sh [host] [port] [password]
# 默认配置
REDIS_HOST="${1:-127.0.0.1}"
REDIS_PORT="${2:-6379}"
REDIS_PASSWORD="${3:-}"
LOG_FILE="/var/log/redis_check.log"
DATE_TIME=$(date '+%Y-%m-%d %H:%M:%S')
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color
# 日志函数
log_msg() {
local level=$1
local msg=$2
echo -e "${DATE_TIME} [${level}] ${msg}" >> ${LOG_FILE}
case $level in
ERROR) echo -e "${RED}${msg}${NC}" ;;
WARNING) echo -e "${YELLOW}${msg}${NC}" ;;
INFO) echo -e "${GREEN}${msg}${NC}" ;;
esac
}
# 检查Redis连接
check_redis_connection() {
local ping_result
if [ -z "$REDIS_PASSWORD" ]; then
ping_result=$(redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT} ping 2>&1)
else
ping_result=$(redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT} -a ${REDIS_PASSWORD} ping 2>&1)
fi
if [ "$ping_result" = "PONG" ]; then
log_msg "INFO" "Redis连接正常 - ${REDIS_HOST}:${REDIS_PORT}"
return 0
else
log_msg "ERROR" "Redis连接失败 - ${REDIS_HOST}:${REDIS_PORT} - ${ping_result}"
return 1
fi
}
# 获取Redis状态信息
get_redis_info() {
local info_result
if [ -z "$REDIS_PASSWORD" ]; then
info_result=$(redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT} info 2>&1)
else
info_result=$(redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT} -a ${REDIS_PASSWORD} info 2>&1)
fi
if [ $? -eq 0 ]; then
echo "$info_result" | grep -E "(connected_clients|used_memory_human|total_connections_received|uptime_in_seconds|role)"
else
log_msg "ERROR" "获取Redis状态信息失败"
fi
}
# 检查关键指标
check_redis_metrics() {
local metrics
local connected_clients
local used_memory
local uptime
if [ -z "$REDIS_PASSWORD" ]; then
metrics=$(redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT} info 2>&1)
else
metrics=$(redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT} -a ${REDIS_PASSWORD} info 2>&1)
fi
if [ $? -eq 0 ]; then
connected_clients=$(echo "$metrics" | grep "connected_clients:" | cut -d: -f2)
used_memory=$(echo "$metrics" | grep "used_memory_human:" | cut -d: -f2)
uptime=$(echo "$metrics" | grep "uptime_in_seconds:" | cut -d: -f2)
log_msg "INFO" "连接数: ${connected_clients} | 内存使用: ${used_memory} | 运行时间: ${uptime}秒"
# 检查连接数是否过高
if [ ${connected_clients} -gt 1000 ]; then
log_msg "WARNING" "连接数过高: ${connected_clients}"
fi
fi
}
# 主函数
main() {
log_msg "INFO" "========== Redis连接巡检开始 =========="
log_msg "INFO" "目标: ${REDIS_HOST}:${REDIS_PORT}"
# 检查Redis连接
if check_redis_connection; then
# 获取状态信息
get_redis_info
# 检查关键指标
check_redis_metrics
fi
log_msg "INFO" "========== Redis连接巡检结束 =========="
echo ""
}
# 执行主函数
main
高级版 - 带邮件告警
#!/bin/bash
# Redis全功能巡检脚本 - 带邮件告警
# 使用方法: ./redis_monitor.sh [host] [port] [password]
# 配置
REDIS_HOST="${1:-127.0.0.1}"
REDIS_PORT="${2:-6379}"
REDIS_PASSWORD="${3:-}"
ALERT_EMAIL="admin@example.com" # 修改为实际邮箱
MAX_CONNECTIONS=5000
WARN_CONNECTIONS=3000
LOG_DIR="/var/log/redis_monitor"
LOG_FILE="${LOG_DIR}/redis_check_$(date +%Y%m%d).log"
# 创建日志目录
mkdir -p ${LOG_DIR}
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a ${LOG_FILE}
}
# 发送告警邮件
send_alert() {
local subject=$1
local body=$2
echo "${body}" | mail -s "[Redis Alert] ${subject}" ${ALERT_EMAIL}
log "已发送告警邮件: ${subject}"
}
# 测试Redis连通性
test_connection() {
local cmd="redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT}"
if [ -n "$REDIS_PASSWORD" ]; then
cmd="${cmd} -a ${REDIS_PASSWORD}"
fi
# 测试PING
if [ "$(${cmd} ping 2>/dev/null)" = "PONG" ]; then
log "✓ Redis连接测试通过"
return 0
else
log "✗ Redis连接测试失败"
return 1
fi
}
# 获取详细信息
get_detailed_info() {
local cmd="redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT}"
if [ -n "$REDIS_PASSWORD" ]; then
cmd="${cmd} -a ${REDIS_PASSWORD}"
fi
local info=$(${cmd} info 2>/dev/null)
log ""
log "=== Redis状态信息 ==="
# 服务器信息
echo "$info" | awk -F: '
/^redis_version:/ {print "版本: " $2}
/^os:/ {print "操作系统: " $2}
/^uptime_in_days:/ {print "运行天数: " $2}
/^connected_clients:/ {print "当前连接数: " $2}
/^used_memory_human:/ {print "内存使用: " $2}
/^total_system_memory_human:/ {print "系统内存: " $2}
/^used_cpu_sys:/ {print "CPU使用(系统): " $2}
/^used_cpu_user:/ {print "CPU使用(用户): " $2}
/^keyspace_hits:/ {print "命中次数: " $2}
/^keyspace_misses:/ {print "未命中次数: " $2}
/^role:/ {print "角色: " $2}
' | tee -a ${LOG_FILE}
}
# 检查性能指标
check_performance() {
local cmd="redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT}"
if [ -n "$REDIS_PASSWORD" ]; then
cmd="${cmd} -a ${REDIS_PASSWORD}"
fi
local info=$(${cmd} info all 2>/dev/null)
# 检查连接数
local clients=$(echo "$info" | grep "^connected_clients:" | cut -d: -f2)
if [ ${clients:-0} -gt ${MAX_CONNECTIONS} ]; then
send_alert "连接数超限" "当前连接数: ${clients}, 超过最大限制: ${MAX_CONNECTIONS}"
elif [ ${clients:-0} -gt ${WARN_CONNECTIONS} ]; then
log "⚠ 连接数警告: ${clients}"
fi
# 检查内存使用
local mem_used=$(echo "$info" | grep "^used_memory_human:" | cut -d: -f2)
log "内存使用: ${mem_used}"
# 检查命中率
local hits=$(echo "$info" | grep "^keyspace_hits:" | cut -d: -f2)
local misses=$(echo "$info" | grep "^keyspace_misses:" | cut -d: -f2)
if [ ${misses:-0} -gt 0 ] && [ ${hits:-0} -gt 0 ]; then
local hit_rate=$(( hits * 100 / (hits + misses) ))
log "缓存命中率: ${hit_rate}%"
if [ ${hit_rate} -lt 80 ]; then
send_alert "缓存命中率低" "当前命中率: ${hit_rate}%"
fi
fi
}
# 检查慢查询
check_slow_queries() {
local cmd="redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT}"
if [ -n "$REDIS_PASSWORD" ]; then
cmd="${cmd} -a ${REDIS_PASSWORD}"
fi
local slow_log=$(${cmd} slowlog get 10 2>/dev/null)
if [ -n "$slow_log" ]; then
local count=$(echo "$slow_log" | grep -c "^1)")
if [ ${count} -gt 0 ]; then
log "最近慢查询数: ${count}"
echo "${slow_log}" >> ${LOG_FILE}
fi
fi
}
# 检查持久化
check_persistence() {
local cmd="redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT}"
if [ -n "$REDIS_PASSWORD" ]; then
cmd="${cmd} -a ${REDIS_PASSWORD}"
fi
local info=$(${cmd} info persistence 2>/dev/null)
local rdb_last_save=$(echo "$info" | grep "^rdb_last_save_time:" | cut -d: -f2)
local aof_enabled=$(echo "$info" | grep "^aof_enabled:" | cut -d: -f2)
log "RDB最后保存时间: $(date -d @${rdb_last_save:-0} '+%Y-%m-%d %H:%M:%S')"
log "AOF持久化: $([ "$aof_enabled" = "1" ] && echo '启用' || echo '未启用')"
}
# 主函数
main() {
log "=========================================="
log "Redis巡检开始 - 目标: ${REDIS_HOST}:${REDIS_PORT}"
log "=========================================="
# 按顺序执行检查
if test_connection; then
get_detailed_info
check_performance
check_slow_queries
check_persistence
fi
log ""
log "Redis巡检完成"
log "=========================================="
echo ""
}
# 执行主函数
main
使用说明
- 基础使用:
# 基本格式 ./check_redis.sh [host] [port] [password]
示例
./check_redis.sh 127.0.0.1 6379 ./check_redis.sh 192.168.1.100 6379 mypassword
2. **赋予执行权限**:
```bash
chmod +x check_redis.sh
- 添加到定时任务(crontab):
# 每5分钟执行一次 */5 * * * * /path/to/check_redis.sh 127.0.0.1 6379 >> /var/log/redis_cron.log 2>&1
每小时执行并发送报告
0 /path/to/redis_monitor.sh 127.0.0.1 6379
## 脚本功能说明
- ✅ **连接检测**:PING测试
- ✅ **状态收集**:版本、内存、连接数等
- ✅ **性能监控**:命中率、慢查询
- ✅ **容量检查**:内存使用、连接数
- ✅ **持久化检查**:RDB/AOF状态
- ✅ **告警通知**:邮件告警(高级版)
- ✅ **日志记录**:详细日志输出
这个脚本可以根据您的具体需求进行调整,比如修改告警阈值、添加更多检查项等。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播