80 lines
3.4 KiB
Bash
80 lines
3.4 KiB
Bash
#!/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
|
||
|