novel-doomsday-resurgence/inkos_comprehensive_monitor.sh
唐天洛 5dc8c00de0 feat(sync): 固化小说内容到Git仓库
📚 小说内容:
- 《末日重生-开局囤货十亿物资》33章
- 完整的状态文件、记忆索引、钩子系统

🛠️ 系统配置:
- 版本控制管理系统
- 自动化脚本系统
- 质量监控系统

🧠 固化记忆:
- 长期记忆文件
- 系统配置文档
- 恢复流程指南

💾 数据安全:
- 本地备份系统
- Git版本控制
- 远程同步机制

同步时间: 2026-03-30 16:25:35
系统状态: inkos正常运行中 (PID: 1433309)
创作进度: 第33章《油粮》创作中
2026-03-30 16:25:35 +08:00

274 lines
9.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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. 准备符合标准的章节投稿"