feat: F2R 重构全部完成 + 自动化脚本改进
Phase 1 翻译 (完成): - TLUSTY 350 函数 100% 翻译 - SYNSPEC 168 函数 100% 翻译 - ~495 Rust 模块 Phase 2 集成 (完成): - TLUSTY RESOLV 7 个 TODO 全部清除 - TLUSTY Runner IJALI 频率选择实现 - OPFRAC ioniz.dat 解析完整实现 - SYNSPEC Runner 编排流程连接完成 - SYNSPEC RESOLV OPAC→RTE→OUTPRI 调用链完整 Phase 3 验证 (完成, 修复 8 处 bug): - INITIA: compute_hydrogen_level_bounds 索引混合修复 - INILIN: GAMR0/GS0/GW0 展宽公式修复, 经典 VdW 公式修复 - INIBL0: CNM 常数 2.997925e18→e17 修复 - OPAC: Lyman IJ=2 修正缺失修复 - RTE: minv3 矩阵求逆符号错误修复 自动化脚本改进: - specf2r.sh: 添加 429 限流退避、完成检测、同步等待 - SKILL.md: 三阶段工作流 + 状态文件系统 - references/: Phase 1/2/3 独立参考文档 新增: - src/bin/synspec.rs: SYNSPEC 可执行文件入口 - .f2r_phase/.f2r_tasks/.f2r_complete: 状态管理文件 编译: 0 错误 | Clippy: 0 错误 | 测试: voigt 28 + eldens 5 通过 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+72
-38
@@ -1,65 +1,99 @@
|
||||
#!/bin/bash
|
||||
|
||||
# --- 配置变量 ---
|
||||
WORK_DIR="/home/fmq/program/SpectraRust"
|
||||
CMD_PATH="/home/fmq/.claude/local/claude"
|
||||
CMD_ARGS="--permission-mode bypassPermissions --print '/codegraph-guide 继续执行重构任务。禁止询问,禁止总结报告,禁止跳过复杂模块。'"
|
||||
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
|
||||
|
||||
# --- 新增:检查是否已有 claude 进程在运行 ---
|
||||
echo "正在检查是否有 claude 进程在运行..."
|
||||
# 使用 ps aux 列出所有进程,然后 grep 查找 'claude',再用 grep -v grep 排除掉 grep 命令本身
|
||||
if ps aux | grep '[c]laude' > /dev/null; then
|
||||
echo "⚠️ 检测到 claude 进程已在运行,退出脚本。"
|
||||
# 可选:显示正在运行的进程信息
|
||||
ps aux | grep '[c]laude'
|
||||
# --- 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
|
||||
|
||||
# --- 2. 启动进程 ---
|
||||
# 切换到工作目录
|
||||
# --- 5. 启动进程 ---
|
||||
cd "$WORK_DIR" || exit 1
|
||||
|
||||
# 执行命令
|
||||
# nohup 保证退出终端后进程不挂
|
||||
# < /dev/null 防止进程读取终端输入导致挂起
|
||||
# > "$LOG_FILE" 2>&1 将标准输出和错误输出都重定向到日志文件
|
||||
nohup "$CMD_PATH" $CMD_ARGS < /dev/null > "$LOG_FILE" 2>&1 &
|
||||
nohup "$CMD_PATH" --permission-mode bypassPermissions --print "$CMD_PROMPT" \
|
||||
< /dev/null > "$LOG_FILE" 2>&1 &
|
||||
CURRENT_PID=$!
|
||||
|
||||
# --- 3. 验证启动结果 ---
|
||||
# 短暂休眠,给进程一点初始化时间,以便捕获即时崩溃(如缺少动态库)
|
||||
sleep 0.5
|
||||
# --- 6. 等待完成并分析结果 ---
|
||||
# --print 模式是同步的,wait 等它结束
|
||||
wait "$CURRENT_PID" 2>/dev/null
|
||||
EXIT_CODE=$?
|
||||
|
||||
# 检查进程是否仍然存活
|
||||
if kill -0 "$CURRENT_PID" 2>/dev/null; then
|
||||
echo "启动成功!"
|
||||
echo "PID: $CURRENT_PID"
|
||||
echo "日志路径: $LOG_FILE"
|
||||
exit 0
|
||||
else
|
||||
echo "❌ 启动失败! 进程已意外退出。"
|
||||
echo "--- 错误日志预览 ---"
|
||||
# 如果日志文件存在,打印其内容
|
||||
if [ -f "$LOG_FILE" ]; then
|
||||
cat "$LOG_FILE"
|
||||
else
|
||||
echo "(无日志文件生成)"
|
||||
# --- 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
|
||||
exit 1
|
||||
|
||||
# 检测模型不存在错误
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user