novel-doomsday-resurgence/inkos_comprehensive_monitor.sh

274 lines
9.2 KiB
Bash
Raw Normal View History

#!/bin/bash
echo "=== inkos 综合监控系统 ==="
echo "时间: $(date)"
echo "监控范围: 产出监控 + 质量变化监控 + 系统状态监控"
echo ""
# 配置
PROJECT_DIR="/root/.openclaw/workspace/tomato-novel"
BOOK_ID="末日重生-开局囤货十亿物资"
CHAP_DIR="$PROJECT_DIR/books/$BOOK_ID/chapters"
LOG_FILE="/tmp/inkos_optimized.log"
QUALITY_SCRIPT="/root/.openclaw/workspace/tomato-novel/scripts/simple_quality_check.py"
MONITOR_INTERVAL=30 # 秒
MAX_MONITOR_MINUTES=30
# 创建监控目录
MONITOR_DIR="/root/.openclaw/workspace/inkos_monitor_data"
mkdir -p "$MONITOR_DIR"
# 初始化状态文件
STATE_FILE="$MONITOR_DIR/monitor_state.json"
if [ ! -f "$STATE_FILE" ]; then
cat > "$STATE_FILE" << EOF
{
"last_chapter_count": 0,
"last_audit_pass_rate": 0,
"last_quality_score": 0,
"chapters_checked": [],
"monitor_start_time": "$(date -Iseconds)",
"quality_reports": {}
}
EOF
fi
# 函数:获取当前状态
get_current_state() {
echo "📊 获取当前状态..."
# 1. inkos 进程状态
if ps aux | grep "inkos up" | grep -v grep > /dev/null; then
INKOS_PID=$(ps aux | grep "inkos up" | grep -v grep | awk '{print $2}')
INKOS_STATUS="running"
else
INKOS_PID=""
INKOS_STATUS="stopped"
fi
# 2. 章节数量
CHAPTER_COUNT=$(find "$CHAP_DIR" -name "*.md" -type f | grep -E "^[0-9]{4}_" | wc -l)
# 3. 最新章节
LATEST_CHAPTER=$(find "$CHAP_DIR" -name "*.md" -type f -printf "%T@ %p\n" | sort -rn | head -1 | cut -d' ' -f2-)
if [ -n "$LATEST_CHAPTER" ]; then
LATEST_NAME=$(basename "$LATEST_CHAPTER")
LATEST_SIZE=$(wc -c < "$LATEST_CHAPTER" 2>/dev/null || echo 0)
LATEST_TIME=$(stat -c %y "$LATEST_CHAPTER" 2>/dev/null || echo "unknown")
else
LATEST_NAME="none"
LATEST_SIZE=0
LATEST_TIME="unknown"
fi
# 4. 日志状态
if [ -f "$LOG_FILE" ]; then
LOG_LINES=$(wc -l < "$LOG_FILE")
LOG_TAIL=$(tail -3 "$LOG_FILE" | tr '\n' ' ')
else
LOG_LINES=0
LOG_TAIL="no log file"
fi
# 5. 质量评估(定期执行,避免每次调用)
QUALITY_DATA="{}"
if [ $(( $(date +%s) % 300 )) -lt 10 ]; then # 每5分钟执行一次
echo " 🔍 执行定期质量评估..."
cd "$PROJECT_DIR"
inkos eval "$BOOK_ID" --json > /tmp/inkos_eval_latest.json 2>/dev/null
if [ -f /tmp/inkos_eval_latest.json ]; then
QUALITY_DATA=$(cat /tmp/inkos_eval_latest.json)
fi
fi
# 返回状态
cat << EOF
{
"timestamp": "$(date -Iseconds)",
"inkos_status": "$INKOS_STATUS",
"inkos_pid": "$INKOS_PID",
"chapter_count": $CHAPTER_COUNT,
"latest_chapter": {
"name": "$LATEST_NAME",
"size": $LATEST_SIZE,
"time": "$LATEST_TIME"
},
"log_status": {
"lines": $LOG_LINES,
"tail": "$LOG_TAIL"
},
"quality_data": $QUALITY_DATA
}
EOF
}
# 函数:检查新章节
check_new_chapters() {
echo "🔍 检查新章节..."
# 获取当前章节列表
CURRENT_CHAPS=$(find "$CHAP_DIR" -name "*.md" -type f -printf "%f\n" | sort)
LAST_CHAPS=$(jq -r '.chapters_checked[]' "$STATE_FILE" 2>/dev/null || echo "")
# 比较差异
NEW_CHAPS=$(comm -13 <(echo "$LAST_CHAPS" | sort) <(echo "$CURRENT_CHAPS" | sort))
if [ -n "$NEW_CHAPS" ]; then
echo "🎉 发现新章节:"
echo "$NEW_CHAPS" | while read -r chap; do
echo " 📄 $chap"
# 检查新章节质量
CHAPTER_FILE="$CHAP_DIR/$chap"
if [ -f "$CHAPTER_FILE" ]; then
echo " 🔍 执行质量检查..."
QUALITY_REPORT=$(python3 "$QUALITY_SCRIPT" "$CHAPTER_FILE" 2>/dev/null | grep -E "段落分析|爽点分析|对话分析|发现问题|修复建议")
echo "$QUALITY_REPORT" | sed 's/^/ /'
# 保存质量报告
REPORT_FILE="$MONITOR_DIR/${chap}_quality_$(date +%Y%m%d_%H%M%S).txt"
python3 "$QUALITY_SCRIPT" "$CHAPTER_FILE" > "$REPORT_FILE" 2>&1
echo " 📊 报告保存: $(basename "$REPORT_FILE")"
fi
done
# 更新状态文件
jq --arg newchaps "$NEW_CHAPS" \
'.chapters_checked = (.chapters_checked + ($newchaps | split("\n") | map(select(. != ""))))' \
"$STATE_FILE" > "$STATE_FILE.tmp" && mv "$STATE_FILE.tmp" "$STATE_FILE"
return 1 # 有新章节
else
echo " 📝 无新章节"
return 0 # 无新章节
fi
}
# 函数:监控质量变化
monitor_quality_changes() {
echo "📈 监控质量变化..."
# 获取最新的质量评估
if [ -f /tmp/inkos_eval_latest.json ]; then
CURRENT_EVAL=$(cat /tmp/inkos_eval_latest.json)
# 提取关键指标
CURRENT_SCORE=$(echo "$CURRENT_EVAL" | jq -r '.qualityScore // 0')
CURRENT_PASS_RATE=$(echo "$CURRENT_EVAL" | jq -r '.auditPassRate // 0')
FAILED_COUNT=$(echo "$CURRENT_EVAL" | jq -r '.chapters[] | select(.status == "audit-failed") | .number' | wc -l)
# 获取之前的状态
LAST_SCORE=$(jq -r '.last_quality_score' "$STATE_FILE")
LAST_PASS_RATE=$(jq -r '.last_audit_pass_rate' "$STATE_FILE")
# 检查变化
SCORE_CHANGE=$(echo "$CURRENT_SCORE - $LAST_SCORE" | bc)
PASS_RATE_CHANGE=$(echo "$CURRENT_PASS_RATE - $LAST_PASS_RATE" | bc)
if [ $(echo "$SCORE_CHANGE != 0" | bc) -eq 1 ] || [ $(echo "$PASS_RATE_CHANGE != 0" | bc) -eq 1 ]; then
echo " 📊 质量指标变化:"
echo " 质量评分: $LAST_SCORE$CURRENT_SCORE (${SCORE_CHANGE:+$SCORE_CHANGE})"
echo " 审核通过率: $LAST_PASS_RATE% → $CURRENT_PASS_RATE% (${PASS_RATE_CHANGE:+$PASS_RATE_CHANGE}%)"
echo " 审核失败章节: $FAILED_COUNT"
# 更新状态
jq --argjson score "$CURRENT_SCORE" \
--argjson rate "$CURRENT_PASS_RATE" \
'.last_quality_score = $score | .last_audit_pass_rate = $rate' \
"$STATE_FILE" > "$STATE_FILE.tmp" && mv "$STATE_FILE.tmp" "$STATE_FILE"
else
echo " 📊 质量指标稳定:"
echo " 质量评分: $CURRENT_SCORE"
echo " 审核通过率: $CURRENT_PASS_RATE%"
echo " 审核失败章节: $FAILED_COUNT"
fi
else
echo " ⚠️ 暂无质量评估数据"
fi
}
# 函数:监控系统状态
monitor_system_status() {
echo "🖥️ 监控系统状态..."
# CPU 和内存使用
if ps aux | grep "inkos up" | grep -v grep > /dev/null; then
PID=$(ps aux | grep "inkos up" | grep -v grep | awk '{print $2}')
CPU_USAGE=$(ps -p "$PID" -o %cpu --no-headers 2>/dev/null || echo "0")
MEM_USAGE=$(ps -p "$PID" -o %mem --no-headers 2>/dev/null || echo "0")
echo " 🔧 inkos 进程状态:"
echo " PID: $PID"
echo " CPU使用: ${CPU_USAGE}%"
echo " 内存使用: ${MEM_USAGE}%"
else
echo " ❌ inkos 未运行"
fi
# 磁盘空间
DISK_USAGE=$(df -h "$PROJECT_DIR" | tail -1 | awk '{print $5}')
echo " 💾 磁盘使用: $DISK_USAGE"
}
# 主监控循环
echo "🔄 开始综合监控..."
echo "监控间隔: ${MONITOR_INTERVAL}"
echo "最长监控: ${MAX_MONITOR_MINUTES}分钟"
echo ""
for ((i=1; i<=$((MAX_MONITOR_MINUTES*60/MONITOR_INTERVAL)); i++)); do
echo "========================================"
echo "监控周期 #$i - $(date +%H:%M:%S)"
echo "========================================"
# 1. 检查系统状态
monitor_system_status
echo ""
# 2. 检查新章节
if check_new_chapters; then
echo " 📝 无新章节产出"
fi
echo ""
# 3. 监控质量变化每3个周期执行一次
if [ $((i % 3)) -eq 0 ]; then
monitor_quality_changes
echo ""
fi
# 4. 显示当前状态摘要
echo "📋 状态摘要:"
CURRENT_STATE=$(get_current_state)
echo "$CURRENT_STATE" | jq -r '
" 章节数量: \(.chapter_count) 章",
" 最新章节: \(.latest_chapter.name) (\(.latest_chapter.size) 字符)",
" inkos状态: \(.inkos_status) (PID: \(.inkos_pid))",
" 日志状态: \(.log_status.tail)"
'
# 保存监控快照
SNAPSHOT_FILE="$MONITOR_DIR/snapshot_$(date +%Y%m%d_%H%M%S).json"
echo "$CURRENT_STATE" > "$SNAPSHOT_FILE"
echo ""
echo "⏳ 等待 ${MONITOR_INTERVAL}秒..."
sleep $MONITOR_INTERVAL
done
echo ""
echo "========================================"
echo "监控结束 - 达到最长监控时间"
echo "时间: $(date)"
echo "========================================"
echo ""
echo "📁 监控数据保存位置: $MONITOR_DIR"
echo "📊 监控报告:"
find "$MONITOR_DIR" -name "*.json" -o -name "*quality_*.txt" | sort | tail -5 | while read -r file; do
echo " 📄 $(basename "$file")"
done
echo ""
echo "🎯 建议:"
echo "1. 检查新章节质量是否符合番茄小说标准"
echo "2. 观察审核通过率是否提升"
echo "3. 根据监控数据调整写作参数"
echo "4. 准备符合标准的章节投稿"