提交 0396ae7f authored 作者: PGY's avatar PGY

feat(自动化部署脚本):重构成都太行 Redis 与 Java 服务监控脚本,提升系统可靠性与可维护性

- Redis 监控脚本 (monitor_redis_service.sh):
  - 增强日志记录与错误处理机制。
  - 移除重启失败时的高风险数据清理逻辑。
  - 引入 PID 锁机制,防止脚本并发重叠执行。
  - 采用动态轮询替代固定等待,用于检测服务恢复状态。
  - 优化密码处理逻辑,避免硬编码。
  - 新增日志轮转功能,以控制日志文件大小。

- Java 服务监控脚本 (monitor_ujava_service.sh):
  - 重构服务检查逻辑,简化进程检测流程。
  - 引入动态轮询机制,用于检测服务恢复状态。
  - 使用 flock 命令实现并发控制。
  - 整合服务定义,降低后续维护难度。
  - 完善错误处理与日志记录,提升故障诊断能力。
  - 优化容器与服务的重启逻辑。
上级 f3f26dc1
......@@ -4,7 +4,7 @@
CONTAINER_NAME="umysql"
DB_USER="root"
HOST_BACKUP_DIR="/opt/mysql" # 宿主机备份目录
LOG_FILE="/var/log/backup_mysql_databases.log"
LOG_FILE="/var/log/scripts/backup_mysql_databases.log"
RETENTION_DAYS=30
TARGET_DBS=("devops" "devops_voice" "huazhao2" "nacos_mysql" "offline" "ubains" "wifi" "voice" "ubains_nacos_config" "ubains_sso")
......
#!/bin/bash
# clear_deleted_files.sh - 定时清理被进程占用的已删除文件
LOG_FILE="/var/log/cleanup_deleted_files.log"
LOG_FILE="/var/log/scripts/cleanup_deleted_files.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] 开始检查被占用的已删除文件..." >> "$LOG_FILE"
......
#!/bin/bash
# 宿主机上的脚本:检查 Nacos,失败则重启 ujava2 容器中的服务
LOG_FILE="/var/log/monitor_nacos_service.log"
# ==================== 配置区(修改配置请在此处调整) ====================
CONTAINER_NAME="ujava2" # 需要监控的容器名称(Nacos 运行在此容器内)
NACOS_HEALTH_URL="http://127.0.0.1:8848/nacos/v1/console/health/readiness" # Nacos 健康检查接口
START_SCRIPT="/var/www/java/start.sh" # 容器内服务启动脚本路径
CHECK_RETRIES=3 # 服务不可用的重试次数
CHECK_RETRY_INTERVAL=5 # 每次重试间隔(秒)
CHECK_TIMEOUT=5 # curl 连接超时(秒)
POLL_INTERVAL=10 # 重启后轮询检查间隔(秒)
# 注意:start.sh 需等待 120s 才通知 Nacos 启动,Nacos 收到指令后再等 300s 才执行启动,
# 即重启后最快也要 7 分钟才开始真正启动,所以等待时限必须 >= 10 分钟,否则会误报超时。
POLL_TIMEOUT_MINUTES=12 # 重启后轮询最长等待时间(分钟)
CONTAINER_START_WAIT=30 # 容器启动后初始等待时间(秒)
LOG_FILE="/var/log/scripts/monitor_nacos_service.log"
# ========================================================================
# */15 * * * * /data/services/scripts/monitor_nacos_service.sh
# ==================== 日志函数 ====================
log() {
local message
message="$(date '+%Y-%m-%d %H:%M:%S') - $1"
......@@ -11,37 +28,89 @@ log() {
echo "$message" >> "$LOG_FILE"
}
# ==================== 健康检查 ====================
check_nacos() {
# 确保 127.0.0.1:8848 可访问(Nacos 端口已映射到宿主机)
if curl -sf http://127.0.0.1:8848/nacos/v1/console/health/readiness >/dev/null; then
return 0
else
return 1
fi
local i
# 重试多次,避免网络抖动导致误判
for i in $(seq 1 $CHECK_RETRIES); do
if curl -sf --max-time "$CHECK_TIMEOUT" "$NACOS_HEALTH_URL" >/dev/null; then
return 0
fi
if [ $i -lt $CHECK_RETRIES ]; then
log "Nacos 检查失败(第${i}次),${CHECK_RETRY_INTERVAL} 秒后重试..."
sleep "$CHECK_RETRY_INTERVAL"
fi
done
log "Nacos 检查失败,已连续重试 ${CHECK_RETRIES} 次,确认服务不可用"
return 1
}
# ==================== 重启容器内服务 ====================
restart_in_container() {
log "Nacos NOT READY. Restarting services in container 'ujava2'..."
log "Nacos 不可用,正在重启容器 '$CONTAINER_NAME' 内的服务..."
# 检查容器是否正在运行(精确匹配名称)
if ! docker ps --format '{{.Names}}' | grep -Fxq "ujava2"; then
log "ERROR: Container 'ujava2' is not running!"
return 1
if ! docker ps --format '{{.Names}}' | grep -Fxq "$CONTAINER_NAME"; then
# 容器未运行,尝试启动容器
if docker ps -a --format '{{.Names}}' | grep -Fxq "$CONTAINER_NAME"; then
log "容器 $CONTAINER_NAME 未运行,尝试启动容器..."
if docker start "$CONTAINER_NAME"; then
log "容器 $CONTAINER_NAME 已成功启动,等待 ${CONTAINER_START_WAIT} 秒让服务初始化..."
sleep "$CONTAINER_START_WAIT"
else
log "错误: 无法启动容器 $CONTAINER_NAME,请检查容器状态"
return 1
fi
else
log "错误: 容器 '$CONTAINER_NAME' 不存在,请手动检查容器状态"
return 1
fi
fi
# 在容器内执行 start.sh
if docker exec ujava2 /var/www/java/start.sh; then
log "SUCCESS: Services restarted in ujava2."
else
log "ERROR: Failed to run start.sh in ujava2."
# 容器运行中,执行启动脚本重启服务
if ! docker exec "$CONTAINER_NAME" "$START_SCRIPT"; then
log "错误: 在 $CONTAINER_NAME 容器内执行 $START_SCRIPT 失败"
return 1
fi
log "$START_SCRIPT 执行成功,开始动态轮询等待 Nacos 启动..."
return 0
}
# ==================== 动态等待服务启动 ====================
wait_for_nacos() {
local timeout_minutes="${1:-$POLL_TIMEOUT_MINUTES}" # 最长等待分钟数
local max_attempts=$((timeout_minutes * 60 / POLL_INTERVAL))
local attempt=0
while [ $attempt -lt $max_attempts ]; do
attempt=$((attempt + 1))
if curl -sf --max-time "$CHECK_TIMEOUT" "$NACOS_HEALTH_URL" >/dev/null 2>&1; then
log "Nacos 服务已启动(耗时约 $((attempt * POLL_INTERVAL / 60))$((attempt * POLL_INTERVAL % 60)) 秒)"
return 0
fi
sleep "$POLL_INTERVAL"
done
log "Nacos 服务在 ${timeout_minutes} 分钟内未启动,已超时"
return 1
}
# 主逻辑
# ==================== 主逻辑 ====================
log "开始检查 Nacos 服务状态..."
if check_nacos; then
log "Nacos is healthy."
log "Nacos 服务状态正常"
else
log "Nacos is not responding."
restart_in_container
log "Nacos 服务不可用,正在尝试恢复..."
if restart_in_container; then
# 动态轮询等待 Nacos 启动
if wait_for_nacos; then
log "Nacos 服务已成功恢复,当前状态正常"
else
log "错误: 重启后 Nacos 服务在 ${POLL_TIMEOUT_MINUTES} 分钟内仍未恢复,请手动检查容器日志: docker logs $CONTAINER_NAME"
fi
else
log "错误: 服务恢复失败,请手动检查容器状态: docker ps -a"
fi
fi
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论