refine the code to different part
This commit is contained in:
79
S99archery
Normal file
79
S99archery
Normal file
@@ -0,0 +1,79 @@
|
||||
#!/bin/sh
|
||||
# /etc/init.d/S99archery
|
||||
# 系统启动时处理致命错误恢复(仅处理无法启动的情况)
|
||||
# 注意:应用的启动由系统自动启动机制处理(通过 auto_start.txt)
|
||||
# 功能:
|
||||
# 1. 处理致命错误(无法启动)- 恢复 main.py
|
||||
# 2. 如果重启次数超过阈值,恢复 main.py 并重启系统
|
||||
|
||||
APP_DIR="/maixapp/apps/t11"
|
||||
MAIN_PY="$APP_DIR/main.py"
|
||||
PENDING_FILE="$APP_DIR/ota_pending.json"
|
||||
BACKUP_BASE="$APP_DIR/backups"
|
||||
|
||||
# 进入应用目录
|
||||
cd "$APP_DIR" || exit 0
|
||||
|
||||
# 检查 pending 文件,如果存在且超过重启次数,恢复 main.py(处理致命错误)
|
||||
if [ -f "$PENDING_FILE" ]; then
|
||||
echo "[S99] 检测到 ota_pending.json,检查重启计数..."
|
||||
|
||||
# 尝试从JSON中提取重启计数(使用grep简单提取)
|
||||
RESTART_COUNT=$(cat "$PENDING_FILE" 2>/dev/null | grep -o '"restart_count":[0-9]*' | grep -o '[0-9]*' || echo "0")
|
||||
MAX_RESTARTS=$(cat "$PENDING_FILE" 2>/dev/null | grep -o '"max_restarts":[0-9]*' | grep -o '[0-9]*' || echo "3")
|
||||
|
||||
if [ -n "$RESTART_COUNT" ] && [ "$RESTART_COUNT" -ge "$MAX_RESTARTS" ]; then
|
||||
echo "[S99] 检测到重启次数 ($RESTART_COUNT) 超过阈值 ($MAX_RESTARTS),恢复 main.py..."
|
||||
|
||||
# 尝试从JSON中提取备份目录
|
||||
BACKUP_DIR=$(cat "$PENDING_FILE" 2>/dev/null | grep -o '"backup_dir":"[^"]*"' | grep -o '/[^"]*' || echo "")
|
||||
|
||||
if [ -n "$BACKUP_DIR" ] && [ -f "$BACKUP_DIR/main.py" ]; then
|
||||
# 使用指定的备份目录
|
||||
echo "[S99] 从备份目录恢复: $BACKUP_DIR/main.py"
|
||||
cp "$BACKUP_DIR/main.py" "$MAIN_PY" 2>/dev/null && echo "[S99] 已恢复 main.py"
|
||||
else
|
||||
# 查找最新的备份目录
|
||||
LATEST_BACKUP=$(ls -dt "$BACKUP_BASE"/backup_* 2>/dev/null | head -1)
|
||||
if [ -n "$LATEST_BACKUP" ] && [ -f "$LATEST_BACKUP/main.py" ]; then
|
||||
echo "[S99] 从最新备份恢复: $LATEST_BACKUP/main.py"
|
||||
cp "$LATEST_BACKUP/main.py" "$MAIN_PY" 2>/dev/null && echo "[S99] 已恢复 main.py"
|
||||
else
|
||||
# 如果没有备份目录,尝试使用 main.py.bak
|
||||
if [ -f "$APP_DIR/main.py.bak" ]; then
|
||||
echo "[S99] 从 main.py.bak 恢复"
|
||||
cp "$APP_DIR/main.py.bak" "$MAIN_PY" 2>/dev/null && echo "[S99] 已恢复 main.py"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# 恢复后重置重启计数,避免循环恢复
|
||||
# 注意:不在这里删除 pending 文件,让 main.py 在心跳成功后删除
|
||||
# 但是重置重启计数,以便恢复后的版本可以重新开始计数
|
||||
python3 -c "
|
||||
import json, os
|
||||
try:
|
||||
pending_path = '$PENDING_FILE'
|
||||
if os.path.exists(pending_path):
|
||||
with open(pending_path, 'r', encoding='utf-8') as f:
|
||||
d = json.load(f)
|
||||
d['restart_count'] = 0 # 重置重启计数
|
||||
with open(pending_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(d, f)
|
||||
print('[S99] 已重置重启计数为 0')
|
||||
except Exception as e:
|
||||
print(f'[S99] 重置重启计数失败: {e}')
|
||||
" 2>/dev/null || echo "[S99] 无法重置重启计数(可能需要Python支持)"
|
||||
|
||||
echo "[S99] 已恢复 main.py,重启系统..."
|
||||
echo "[S99] 注意:pending 文件将在心跳成功后由 main.py 删除"
|
||||
sleep 2
|
||||
reboot
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# 不启动应用,让系统自动启动机制处理
|
||||
# 这个脚本只负责处理致命错误恢复
|
||||
exit 0
|
||||
|
||||
Reference in New Issue
Block a user