#!/bin/bash # 1号机任务检查脚本 # 定时检查任务队列,自动执行学习任务 TASK_QUEUE="/root/.openclaw/workspace/memory/task_queue.txt" LEARN_SCRIPT="/root/.openclaw/tools/learn-workflow.sh" REPORT_DIR="/root/.openclaw/workspace/memory/reports" LOG_FILE="/root/.openclaw/workspace/memory/task.log" DATE=$(date '+%Y-%m-%d %H:%M:%S') mkdir -p "$REPORT_DIR" echo "=== 任务检查: $DATE ===" >> "$LOG_FILE" # 检查任务队列是否存在 if [ ! -f "$TASK_QUEUE" ]; then echo "队列文件不存在" >> "$LOG_FILE" exit 0 fi # 当前时间戳 NOW=$(date +%s) # 读取并执行到期任务 TEMP_FILE=$(mktemp) COMPLETED_FILE=$(mktemp) REPORT_FILE="$REPORT_DIR/$(date '+%Y%m%d_%H%M%S').report" # 开始报告 { echo "任务执行报告" echo "时间: $DATE" echo "================" } > "$REPORT_FILE" # 读取并执行到期任务 while IFS= read -r line; do # 跳过注释和空行 [[ "$line" =~ ^#.*$ ]] && continue [[ -z "$line" ]] && continue # 解析: 时间|主题|类型|数量 TIMESTAMP=$(echo "$line" | cut -d'|' -f1) TOPIC=$(echo "$line" | cut -d'|' -f2) TYPE=$(echo "$line" | cut -d'|' -f3) COUNT=$(echo "$line" | cut -d'|' -f4) # 转换时间为秒 TASK_SECONDS=$(date -d "$TIMESTAMP" +%s 2>/dev/null) if [ -z "$TASK_SECONDS" ]; then echo " ⚠️ 无效时间格式: $TIMESTAMP" echo "[跳过] $TIMESTAMP | $TOPIC | 无效时间格式" >> "$REPORT_FILE" continue fi # 检查是否到期 if [ "$TASK_SECONDS" -le "$NOW" ]; then echo "执行: $TOPIC ($TYPE) x$COUNT" >> "$LOG_FILE" echo "- 任务: $TOPIC" >> "$REPORT_FILE" echo " 类型: $TYPE" >> "$REPORT_FILE" echo " 数量: $COUNT" >> "$REPORT_FILE" echo " 状态: " >> "$REPORT_FILE" # 执行学习任务 TASK_LOG=$(mktemp) if "$LEARN_SCRIPT" "$TOPIC" "$TYPE" "$COUNT" >> "$TASK_LOG" 2>&1; then echo " ✓ 完成: $TOPIC" >> "$LOG_FILE" echo " 完成" >> "$REPORT_FILE" # 记录到已完成 echo "$line" >> "$COMPLETED_FILE" else echo " ✗ 失败: $TOPIC" >> "$LOG_FILE" echo " 失败 (保留重试)" >> "$REPORT_FILE" # 保留到下一轮 echo "$line" >> "$TEMP_FILE" fi # 追加任务日志 echo " 日志:" >> "$REPORT_FILE" sed 's/^/ /' "$TASK_LOG" >> "$REPORT_FILE" rm -f "$TASK_LOG" else # 未到期,保留 echo "$line" >> "$TEMP_FILE" fi done < "$TASK_QUEUE" # 结束报告 { echo "================" echo "完成: $(date '+%Y-%m-%d %H:%M:%S')" } >> "$REPORT_FILE" # 更新任务队列 if [ -f "$COMPLETED_FILE" ]; then # 添加已完成标记 echo "" >> "$COMPLETED_FILE" echo "# 完成于: $DATE" >> "$COMPLETED_FILE" cat "$COMPLETED_FILE" >> "$TASK_QUEUE.completed" fi if [ -f "$TEMP_FILE" ] && [ -s "$TEMP_FILE" ]; then mv "$TEMP_FILE" "$TASK_QUEUE" else rm -f "$TASK_QUEUE" fi # 清理 rm -f "$COMPLETED_FILE" # 清理旧报告 (保留最近3天) find "$REPORT_DIR" -name "*.report" -mtime +3 -delete echo "检查完成: $(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG_FILE" echo "" >> "$LOG_FILE" # 显示报告摘要 if [ -f "$REPORT_FILE" ]; then LINES=$(wc -l < "$REPORT_FILE") echo "报告: $REPORT_FILE ($LINES 行)" fi