#!/bin/bash DEBUG_MODE=0 POWEROAD_DEVICE=`printenv POWEROAD_DEVICE || echo ems` cd "$(dirname "$(readlink -f "$0")")" MY_INSTALL_DIR=/home/poweroad/${POWEROAD_DEVICE} # 关闭所有文件描述符 for fd in $(seq 3 256); do exec {fd}<&- done sleep 5 # 定义常量 APP_START="${MY_INSTALL_DIR}/app_start.sh" UPGRADE_BACKUP="${MY_INSTALL_DIR}/upgrade_backup.sh" UPGRADE_ROLLBACK="${MY_INSTALL_DIR}/upgrade_rollback.sh" UPGRADE_DAEMON="${MY_INSTALL_DIR}/upgrade_daemon.sh" PROFILE_SH="/home/poweroad/.profile" UPGRADE_STATUS_FILE="/var/poweroad/upgrade_status.txt" UPGRADE_LOG="/var/poweroad/upgrade.log" UPGRADE_DIR="/var/poweroad" ROLLBACK="/var/poweroad/${POWEROAD_DEVICE}/upgrade_rollback.sh" # 日志记录函数 log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$UPGRADE_LOG" } # 检查文件大小是否为 0 is_file_empty() { local file="$1" # 检查文件是否存在 if [ ! -f "$file" ]; then echo "File does not exist: $file" return 1 # 文件不存在 fi if [ ! -s "$file" ]; then return 0 # 文件为空,返回0 else return 1 # 文件不为空,返回1 fi } # 清理函数 cleanup() { # 删除 upgrade_status.txt 文件 if [ -f "$UPGRADE_STATUS_FILE" ]; then rm "$UPGRADE_STATUS_FILE" log "已删除 upgrade_status.txt" fi # 删除 upgrade_dir 下除 upgrade.log 之外的所有文件和文件夹 find "$UPGRADE_DIR" -maxdepth 1 -mindepth 1 -not -name "upgrade.log" -exec rm -rf {} \+ log "已删除除 upgrade.log 之外的所有文件和文件夹" } # 检查 ${MY_INSTALL_DIR}/bin/DEBUG 文件是否存在 if [ -f "${MY_INSTALL_DIR}/bin/DEBUG" ]; then # log "DEBUG 文件存在,退出脚本" # exit 0 log "DEBUG 文件存在,为调试模式" DEBUG_MODE=1 fi # 初始化计数器 counter=0 # 主逻辑 while true; do # 检查 app_start.sh 文件大小是否为 0 if is_file_empty "$APP_START"; then log "app_start.sh 文件大小为 0,等待 5 秒后再次检查" sleep 5 if is_file_empty "$APP_START"; then log "app_start.sh 文件大小仍为 0,调用 upgrade_rollback.sh 脚本" echo "rolled_finished" > "$UPGRADE_STATUS_FILE" sync /bin/bash "$ROLLBACK" fi fi # 检查 upgrade_backup.sh 文件大小是否为 0 if is_file_empty "$UPGRADE_BACKUP"; then log "upgrade_backup.sh 文件大小为 0,等待 5 秒后再次检查" sleep 5 if is_file_empty "$UPGRADE_BACKUP"; then log "upgrade_backup.sh 文件大小仍为 0,调用 upgrade_rollback.sh 脚本" echo "rolled_finished" > "$UPGRADE_STATUS_FILE" sync /bin/bash "$ROLLBACK" fi fi # 检查 upgrade_rollback.sh 文件大小是否为 0 if is_file_empty "$UPGRADE_ROLLBACK"; then log "upgrade_rollback.sh 文件大小为 0,等待 5 秒后再次检查" sleep 5 if is_file_empty "$UPGRADE_ROLLBACK"; then log "upgrade_rollback.sh 文件大小仍为 0,调用 upgrade_rollback.sh 脚本" echo "rolled_finished" > "$UPGRADE_STATUS_FILE" sync /bin/bash "$ROLLBACK" fi fi # 检查 upgrade_daemon.sh 文件大小是否为 0 if is_file_empty "$UPGRADE_DAEMON"; then log "upgrade_daemon.sh 文件大小为 0,等待 5 秒后再次检查" sleep 5 if is_file_empty "$UPGRADE_DAEMON"; then log "upgrade_daemon.sh 文件大小仍为 0,调用 upgrade_rollback.sh 脚本" echo "rolled_finished" > "$UPGRADE_STATUS_FILE" sync /bin/bash "$ROLLBACK" fi fi # 检查 /home/poweroad/.profile 是否存在或文件大小是否为 0 if is_file_empty "$PROFILE_SH"; then log ".profile 文件不存在或大小为 0,等待 5 秒后再次检查" sleep 5 if is_file_empty "$PROFILE_SH"; then log ".profile 文件不存在或大小仍为 0,调用 upgrade_rollback.sh 脚本" echo "rolled_finished" > "$UPGRADE_STATUS_FILE" sync /bin/bash "$ROLLBACK" fi fi # 检查 upgrade_status.txt 文件内容是否为 "rollback" if [ -f "$UPGRADE_STATUS_FILE" ]; then content=$(cat "$UPGRADE_STATUS_FILE") if [[ "$content" == "rollback" ]]; then if [ "$DEBUG_MODE" -eq 1 ]; then log "为 DEBUG 模式, 不回滚, 退出脚本!!!" exit 0 fi log "upgrade_status.txt 文件内容为 'rollback',回滚中!!!" echo "rolled_finished" > "$UPGRADE_STATUS_FILE" sync /bin/bash "$ROLLBACK" fi fi if [ -f "$UPGRADE_STATUS_FILE" ]; then content=$(cat "$UPGRADE_STATUS_FILE") if [[ "$content" == "rolled_finished" ]]; then log "已完成回滚,脚本退出!!!" sync cleanup exit 0 fi fi if [ -f "$UPGRADE_STATUS_FILE" ]; then content=$(cat "$UPGRADE_STATUS_FILE") if [[ "$content" == "completed" ]]; then log "升级已完成,脚本退出!!!" sync cleanup exit 0 fi fi # 增加计数器 ((counter++)) # 检查是否达到 6 分钟 if [ $((counter * 5)) -ge 360 ]; then if [ "$DEBUG_MODE" -eq 1 ]; then log "已超过 6 分钟,为 DEBUG 模式, 退出脚本!!!" exit 0 fi if [[ "$content" == "requires_validation" ]]; then log "升级已超过 6 分钟,回滚中!!!" echo "rolled_finished" > "$UPGRADE_STATUS_FILE" sync /bin/bash "$ROLLBACK" exit 0 fi log "升级已超过 6 分钟,清理资源,退出脚本!!!" sync cleanup exit 0 fi # 等待一段时间再进行下一轮检查 sleep 5 done