#!/bin/bash # --- 配置变量 --- WORK_DIR="/home/dckj/SpectraRust" CMD_PATH="/usr/bin/claude" CMD_PROMPT="使用 codegraph-guide skill 继续执行重构任务。" # 状态文件 PHASE_FILE="${WORK_DIR}/.f2r_phase" COMPLETE_FILE="${WORK_DIR}/.f2r_complete" RATE_LIMIT_FILE="${WORK_DIR}/.f2r_rate_limit" TASKS_FILE="${WORK_DIR}/.f2r_tasks" # 日志文件路径 LOG_FILE="${WORK_DIR}/logs/claude_$(date +%Y%m%d_%H%M%S).log" # --- 1. 环境检查 --- if [ ! -d "$WORK_DIR" ]; then echo "❌ 错误: 工作目录不存在: $WORK_DIR" exit 1 fi if [ ! -x "$CMD_PATH" ]; then echo "❌ 错误: 命令不存在或不可执行: $CMD_PATH" exit 1 fi # --- 2. 完成检测 --- if [ -f "$COMPLETE_FILE" ]; then echo "✅ 重构已标记为完成 ($(cat "$COMPLETE_FILE")),跳过。" echo "如需重新启动,请删除 ${COMPLETE_FILE}" exit 0 fi # --- 3. 429 限流退避 --- if [ -f "$RATE_LIMIT_FILE" ]; then LIMIT_UNTIL=$(cat "$RATE_LIMIT_FILE" 2>/dev/null) if [ -n "$LIMIT_UNTIL" ]; then # 将 "2026-06-08 09:10:18" 格式转换为 epoch RESET_EPOCH=$(date -d "$LIMIT_UNTIL" +%s 2>/dev/null) NOW_EPOCH=$(date +%s) if [ -n "$RESET_EPOCH" ] && [ "$NOW_EPOCH" -lt "$RESET_EPOCH" ]; then REMAINING=$(( (RESET_EPOCH - NOW_EPOCH) / 60 )) echo "⏳ API 限流中,还需等待 ${REMAINING} 分钟(重置于 ${LIMIT_UNTIL}),跳过。" exit 0 else # 已过重置时间,清除标记 rm -f "$RATE_LIMIT_FILE" echo "🔓 限流已重置,继续执行。" fi fi fi # --- 4. 检查并发进程 --- RUNNING_PIDS=$(pgrep -f "claude.*--print" 2>/dev/null) if [ -n "$RUNNING_PIDS" ]; then echo "⚠️ 检测到已有调度任务在运行 (PID: $RUNNING_PIDS),退出脚本。" exit 1 fi # --- 5. 启动进程 --- cd "$WORK_DIR" || exit 1 nohup "$CMD_PATH" --permission-mode bypassPermissions --print "$CMD_PROMPT" \ < /dev/null > "$LOG_FILE" 2>&1 & CURRENT_PID=$! # --- 6. 等待完成并分析结果 --- # --print 模式是同步的,wait 等它结束 wait "$CURRENT_PID" 2>/dev/null EXIT_CODE=$? # --- 7. 后处理:检测 429 和完成标记 --- if [ -f "$LOG_FILE" ]; then # 检测 429 限流 if grep -q "429" "$LOG_FILE" 2>/dev/null; then # 提取重置时间(格式:已达到 5 小时的使用上限。您的限额将在 2026-06-08 09:10:18 重置) RESET_TIME=$(grep -oP '限额将在 \K[\d-]+ [\d:]+' "$LOG_FILE" 2>/dev/null | head -1) if [ -n "$RESET_TIME" ]; then echo "$RESET_TIME" > "$RATE_LIMIT_FILE" echo "🔴 检测到 429 限流,重置时间: ${RESET_TIME},已记录到 ${RATE_LIMIT_FILE}" fi fi # 检测模型不存在错误 if grep -q "模型不存在" "$LOG_FILE" 2>/dev/null; then echo "❌ 模型不存在错误,暂停 30 分钟。" echo "$(date -d '+30 minutes' '+%Y-%m-%d %H:%M:%S')" > "$RATE_LIMIT_FILE" fi # 统计日志大小用于诊断 LOG_SIZE=$(wc -c < "$LOG_FILE") echo "✅ 会话完成 | PID: $CURRENT_PID | 退出码: $EXIT_CODE | 日志: ${LOG_SIZE} 字节" echo " 日志路径: $LOG_FILE" else echo "❌ 无日志文件生成" fi exit 0