提交 7fbf0aff authored 作者: 陈泽健's avatar 陈泽健

feat(nacos): 添加Nacos容器服务监控与自愈脚本

- 实现容器模糊匹配查找功能,支持按模式匹配容器名称
- 添加容器健康状态检查,验证容器存在性和运行状态
- 集成容器日志检查,监控ERROR和Exception错误信息
- 实现Nacos服务API可用性检查,支持重试机制
- 添加容器自动重启功能,处理服务异常情况
- 集成HTTPS服务检查,验证外部访问可用性
- 实现脚本并发控制,防止重复执行冲突
- 添加完整的日志记录系统,支持多级别日志输出
- 配置可定制化参数,支持端口、超时等配置项修改
上级 4ed75c52
#!/bin/bash
#===================================================================================
# 功能说明:Nacos容器服务监控与自愈脚本
# 文件路径:自动化部署脚本/x86架构/新统一平台/定时脚本/nacos-service.sh
# 创建日期:2026-05-13
#===================================================================================
# ========== 脚本并发控制 ==========
LOCK_FILE="/tmp/nacos-service.lock"
exec 200>"$LOCK_FILE"
flock -n 200 || {
echo "$(date '+%Y-%m-%d %H:%M:%S') [WARNING] 另一个实例正在运行,退出" | tee -a "$LOG_FILE"
exit 1
}
# ====================================
# ========== 配置参数 ==========
CONTAINER_PATTERN="nacos" # 容器模糊匹配模式
NACOS_PORT="8848" # Nacos服务端口
NACOS_CHECK_URL="http://localhost:8848/nacos/" # 健康检查URL
RETRY_MAX_COUNT=3 # 最大重试次数
RETRY_INTERVAL=10 # 重试间隔(秒)
API_REQUEST_TIMEOUT=5 # API请求超时(秒)
LOG_FILE="/data/logs/nacos-service.log" # 日志文件
SERVER_IP="192.168.5.44" # 服务器IP(可通过环境变量覆盖)
# ========================================
# 获取服务器IP(优先使用环境变量)
SERVER_IP="${NACOS_SERVER_IP:-$SERVER_IP}"
# ========== 日志函数 ==========
timestamp() {
date "+%Y-%m-%d %H:%M:%S"
}
log_info() {
local msg="$1"
echo "$(timestamp) [INFO] $msg" | tee -a "$LOG_FILE"
}
log_warn() {
local msg="$1"
echo "$(timestamp) [WARNING] $msg" | tee -a "$LOG_FILE"
}
log_error() {
local msg="$1"
echo "$(timestamp) [ERROR] $msg" | tee -a "$LOG_FILE"
}
log_success() {
local msg="$1"
echo "$(timestamp) [SUCCESS] $msg" | tee -a "$LOG_FILE"
}
# ========== 容器模糊匹配函数 ==========
# 功能:查找名称包含指定模式的容器
# 返回:容器名称,未找到返回空
find_container() {
local pattern="$1"
local container_name=$(docker ps --format "{{.Names}}" | grep -E "$pattern" | head -n 1)
if [ -z "$container_name" ]; then
log_error "未找到匹配 '$pattern' 的运行中容器"
return 1
fi
log_info "找到容器: $container_name"
echo "$container_name"
return 0
}
# ========== 容器健康检查函数 ==========
# 功能:检查容器是否存在且运行中
# 参数:$1=容器名称
# 返回:0=健康, 1=不健康
check_container_health() {
local container_name="$1"
# 检查容器是否存在
if ! docker inspect "$container_name" &>/dev/null; then
log_error "容器 $container_name 不存在"
return 1
fi
# 检查容器是否运行
local status=$(docker inspect -f '{{.State.Status}}' "$container_name" 2>/dev/null)
if [ "$status" != "running" ]; then
log_error "容器 $container_name 未运行(状态: $status)"
return 1
fi
log_info "容器 $container_name 运行正常"
return 0
}
# ========== 容器日志检查函数 ==========
# 功能:检查容器日志是否有严重错误
# 参数:$1=容器名称
# 返回:0=无严重错误, 1=有严重错误
check_container_logs() {
local container_name="$1"
local log_lines=50
log_info "检查容器 $container_name 日志(最近 $log_lines 行)"
# 获取容器日志,检查是否有ERROR或Exception
local error_count=$(docker logs --tail "$log_lines" "$container_name" 2>&1 | grep -iE "ERROR|Exception|Caused by:" | wc -l)
if [ "$error_count" -gt 0 ]; then
log_warn "容器 $container_name 日志中发现 $error_count 条错误信息"
# 输出部分错误信息用于调试
docker logs --tail 10 "$container_name" 2>&1 | grep -iE "ERROR|Exception|Caused by:" | head -5 | while read line; do
echo " $line" | tee -a "$LOG_FILE"
done
return 1
fi
log_info "容器 $container_name 日志检查通过"
return 0
}
# ========== API请求函数 ==========
# 功能:执行单次Nacos API请求
# 参数:$1=检查URL
# 返回:0=成功, 1=失败
check_nacos_api_request() {
local check_url="$1"
# 使用curl检查Nacos服务
local response=$(curl -k -m ${API_REQUEST_TIMEOUT} -s -S -w "\n%{http_code}" "$check_url" 2>&1)
local curl_exit_code=$?
# 分离响应体和状态码
local http_code=$(echo "$response" | tail -n1)
local response_body=$(echo "$response" | head -n-1)
# 判断curl命令执行结果
if [ $curl_exit_code -ne 0 ]; then
return 1
fi
# 判断HTTP状态码(Nacos控制台正常返回200)
if [ "$http_code" = "200" ] || [ "$http_code" = "302" ]; then
return 0
fi
return 1
}
# ========== Nacos服务可用性检查函数 ==========
# 功能:检查Nacos服务是否可用,支持重试
# 返回:0=可用, 1=不可用
check_nacos_service() {
local retry_count=0
local should_retry=true
# 首次请求
if check_nacos_api_request "$NACOS_CHECK_URL"; then
log_success "Nacos服务检查正常 ($NACOS_CHECK_URL)"
return 0
fi
log_warn "Nacos服务检查失败,开始重试"
# 重试循环
while [ $retry_count -lt $RETRY_MAX_COUNT ] && [ "$should_retry" = "true" ]; do
retry_count=$((retry_count + 1))
log_info "第 ${retry_count} 次重试 Nacos服务检查"
sleep $RETRY_INTERVAL
if check_nacos_api_request "$NACOS_CHECK_URL"; then
log_success "第 ${retry_count} 次重试 Nacos服务检查成功"
return 0
fi
done
log_error "Nacos服务检查失败,已重试 ${RETRY_MAX_COUNT} 次"
return 1
}
# ========== 容器重启函数 ==========
# 功能:重启Nacos容器
# 参数:$1=容器名称
# 返回:0=成功, 1=失败
restart_nacos_container() {
local container_name="$1"
log_warn "开始重启容器 $container_name"
# 重启容器
docker restart "$container_name" >> "$LOG_FILE" 2>&1
local restart_result=$?
if [ $restart_result -eq 0 ]; then
log_success "容器 $container_name 重启成功"
else
log_error "容器 $container_name 重启失败"
return 1
fi
# 等待容器启动
log_info "等待容器 $container_name 启动(30秒)"
sleep 30
# 再次检查容器状态
if check_container_health "$container_name"; then
log_success "容器 $container_name 启动后运行正常"
else
log_error "容器 $container_name 启动后仍不正常"
return 1
fi
# 检查容器日志
check_container_logs "$container_name"
return 0
}
# ========== Nacos HTTPS检查函数 ==========
# 功能:通过HTTPS检查Nacos服务(外部访问)
# 返回:0=成功, 1=失败
check_nacos_https() {
local https_url="https://${SERVER_IP}/nacos"
log_info "检查Nacos HTTPS服务 ($https_url)"
local response=$(curl -k -m ${API_REQUEST_TIMEOUT} -s -S -w "\n%{http_code}" "$https_url" 2>&1)
local http_code=$(echo "$response" | tail -n1)
if [ "$http_code" = "200" ] || [ "$http_code" = "302" ]; then
log_success "Nacos HTTPS服务检查正常"
return 0
else
log_warn "Nacos HTTPS服务检查失败 (HTTP $http_code)"
return 1
fi
}
# ========== 主流程 ==========
main() {
log_info "=========================================="
log_info "Nacos服务监控脚本开始执行"
log_info "=========================================="
# 1. 模糊查找Nacos容器
local nacos_container=$(find_container "$CONTAINER_PATTERN")
if [ $? -ne 0 ]; then
log_error "未找到Nacos容器,脚本退出"
exit 1
fi
# 2. 检查容器健康状态
if ! check_container_health "$nacos_container"; then
log_warn "容器健康检查失败,尝试重启"
if ! restart_nacos_container "$nacos_container"; then
log_error "容器重启失败,脚本退出"
exit 1
fi
# 重启成功后继续后续检查
fi
# 3. 检查容器日志
check_container_logs "$nacos_container"
# 4. 检查Nacos本地服务(HTTP)
if ! check_nacos_service; then
log_warn "Nacos本地服务检查失败,尝试重启容器"
if ! restart_nacos_container "$nacos_container"; then
log_error "容器重启失败,脚本退出"
exit 1
fi
# 重启后再次检查服务
log_info "重启后再次检查Nacos服务"
if ! check_nacos_service; then
log_error "重启后Nacos服务仍异常,脚本退出(不再处理)"
exit 1
fi
fi
# 5. 检查Nacos HTTPS服务(外部访问)
check_nacos_https
log_info "=========================================="
log_info "Nacos服务监控脚本执行完成"
log_info "=========================================="
exit 0
}
# 执行主流程
main
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论