#!/bin/bash # 会话隔离管理器 # 功能: 自动归档和清理旧会话,防止会话文件冲突 # 策略: 文件超过2小时未更新 = 已完成 = 归档 SESSION_DIR="/root/.openclaw/agents/main/sessions" ARCHIVE_DIR="/root/.openclaw/agents/main/sessions-archive" MAX_SESSION_AGE_HOURS=2 echo "=== 会话隔离管理 $(date) ===" # 创建归档目录 mkdir -p "$ARCHIVE_DIR" # 1. 归档超过2小时未更新的会话 echo "1. 归档超过${MAX_SESSION_AGE_HOURS}小时未更新的会话..." current_time=$(date +%s) archived_count=0 # 获取会话文件列表 session_files=($SESSION_DIR/*.jsonl) for session in "${session_files[@]}"; do [ -f "$session" ] || continue # 获取文件名 filename=$(basename "$session") # 跳过主会话 (agent:main) if [[ "$filename" == *"18095fa2"* ]]; then continue fi # 获取文件修改时间 mtime=$(stat -c %Y "$session" 2>/dev/null) [ -z "$mtime" ] && continue # 计算时间差(小时) age_hours=$(( (current_time - mtime) / 3600 )) # 超过2小时未更新,归档 if [ "$age_hours" -ge "$MAX_SESSION_AGE_HOURS" ]; then mv "$session" "$ARCHIVE_DIR/" 2>/dev/null echo " 归档: $filename (${age_hours}h未更新)" ((archived_count++)) fi done echo " 已归档 $archived_count 个会话" # 2. 清理归档目录中超过3天的会话 echo "" echo "2. 清理归档目录中超过3天的会话..." find "$ARCHIVE_DIR" -name "*.jsonl" -type f -mtime +3 -delete 2>/dev/null find "$ARCHIVE_DIR" -name "*.jsonl.gz" -type f -mtime +3 -delete 2>/dev/null # 3. 压缩超大会话文件 (>10MB) echo "" echo "3. 压缩超大会话..." for session in "$SESSION_DIR"/*.jsonl; do [ -f "$session" ] || continue size_mb=$(du -m "$session" 2>/dev/null | cut -f1) if [ "$size_mb" -gt 10 ] 2>/dev/null; then gzip -k "$session" 2>/dev/null echo " 已压缩: $(basename "$session") (${size_mb}MB)" fi done # 4. 清理锁文件 echo "" echo "4. 清理过期锁文件..." find "$SESSION_DIR" -name "*.lock" -type f -mmin +60 -delete 2>/dev/null # 5. 统计 echo "" echo "=== 当前状态 ===" echo "活跃会话: $(ls $SESSION_DIR/*.jsonl 2>/dev/null | wc -l)" echo "归档会话: $(ls $ARCHIVE_DIR/*.jsonl 2>/dev/null | wc -l)" echo "归档压缩: $(ls $ARCHIVE_DIR/*.jsonl.gz 2>/dev/null | wc -l)" echo "" echo "完成!"