📚 小说内容: - 《末日重生-开局囤货十亿物资》33章 - 完整的状态文件、记忆索引、钩子系统 🛠️ 系统配置: - 版本控制管理系统 - 自动化脚本系统 - 质量监控系统 🧠 固化记忆: - 长期记忆文件 - 系统配置文档 - 恢复流程指南 💾 数据安全: - 本地备份系统 - Git版本控制 - 远程同步机制 同步时间: 2026-03-30 16:25:35 系统状态: inkos正常运行中 (PID: 1433309) 创作进度: 第33章《油粮》创作中
274 lines
9.2 KiB
Bash
Executable File
274 lines
9.2 KiB
Bash
Executable File
#!/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. 准备符合标准的章节投稿" |