You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.1 KiB
106 lines
3.1 KiB
#!/bin/bash
|
|
|
|
# 健康检查脚本:定期检查应用是否正常运行,如果不正常则自动重启
|
|
|
|
# 配置参数
|
|
APP_DIR="/app"
|
|
DOCKER_COMPOSE_FILE="docker-compose.yml"
|
|
CHECK_INTERVAL=300 # 检查间隔(秒)
|
|
MAX_RESTARTS=3 # 最大重启次数
|
|
RESTART_INTERVAL=3600 # 重启间隔(秒)
|
|
|
|
# 带颜色的日志函数
|
|
colored_log() {
|
|
local color=$1
|
|
local message=$2
|
|
local reset="\033[0m"
|
|
local colors=(
|
|
["red"]="\033[31m"
|
|
["green"]="\033[32m"
|
|
["yellow"]="\033[33m"
|
|
["blue"]="\033[34m"
|
|
["purple"]="\033[35m"
|
|
)
|
|
echo -e "${colors[$color]}[$(date '+%Y-%m-%d %H:%M:%S')] $message$reset"
|
|
}
|
|
|
|
log() {
|
|
colored_log "blue" "$1"
|
|
}
|
|
|
|
success() {
|
|
colored_log "green" "$1"
|
|
}
|
|
|
|
error() {
|
|
colored_log "red" "$1"
|
|
}
|
|
|
|
warning() {
|
|
colored_log "yellow" "$1"
|
|
}
|
|
|
|
log "启动健康检查服务..."
|
|
|
|
# 初始化重启计数器
|
|
restart_count=0
|
|
last_restart_time=$(date +%s)
|
|
|
|
while true; do
|
|
log "开始健康检查..."
|
|
|
|
cd "$APP_DIR"
|
|
|
|
# 检查容器是否在运行
|
|
if docker-compose -f "$DOCKER_COMPOSE_FILE" ps | grep -q "Up"; then
|
|
# 检查应用是否能正常响应
|
|
if curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 > /dev/null; then
|
|
success "应用运行正常"
|
|
else
|
|
warning "应用容器在运行,但无法正常响应请求"
|
|
|
|
# 查看应用日志
|
|
log "查看应用日志:"
|
|
docker-compose -f "$DOCKER_COMPOSE_FILE" logs -n 10
|
|
|
|
# 检查重启次数
|
|
current_time=$(date +%s)
|
|
time_since_last_restart=$((current_time - last_restart_time))
|
|
|
|
if [ $restart_count -lt $MAX_RESTARTS ] || [ $time_since_last_restart -gt $RESTART_INTERVAL ]; then
|
|
log "尝试重启应用..."
|
|
if docker-compose -f "$DOCKER_COMPOSE_FILE" restart; then
|
|
success "应用已重启"
|
|
restart_count=$((restart_count + 1))
|
|
last_restart_time=$current_time
|
|
else
|
|
error "应用重启失败"
|
|
fi
|
|
else
|
|
error "已达到最大重启次数,在$RESTART_INTERVAL秒内不再尝试重启"
|
|
fi
|
|
fi
|
|
else
|
|
warning "应用容器未运行"
|
|
|
|
# 检查重启次数
|
|
current_time=$(date +%s)
|
|
time_since_last_restart=$((current_time - last_restart_time))
|
|
|
|
if [ $restart_count -lt $MAX_RESTARTS ] || [ $time_since_last_restart -gt $RESTART_INTERVAL ]; then
|
|
log "尝试启动应用..."
|
|
if docker-compose -f "$DOCKER_COMPOSE_FILE" up -d; then
|
|
success "应用已启动"
|
|
restart_count=$((restart_count + 1))
|
|
last_restart_time=$current_time
|
|
else
|
|
error "应用启动失败"
|
|
fi
|
|
else
|
|
error "已达到最大重启次数,在$RESTART_INTERVAL秒内不再尝试启动"
|
|
fi
|
|
fi
|
|
|
|
log "健康检查完成,等待$CHECK_INTERVAL秒后再次检查..."
|
|
sleep $CHECK_INTERVAL
|
|
done
|