#!/bin/bash # inkos 监控脚本 # 功能:监控 inkos 守护进程状态,每小时检查工作进度 # 如果进程停止,根据问题修复后重启 LOG_FILE="/tmp/inkos-monitor-$(date +%Y%m%d).log" PROJECT_DIR="/root/.openclaw/workspace/tomato-novel" DAEMON_PID_FILE="/tmp/inkos-daemon.pid" # 记录日志 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # 检查 inkos 守护进程是否运行 check_daemon() { if pgrep -f "inkos up" > /dev/null; then DAEMON_PID=$(pgrep -f "inkos up") log "✅ inkos 守护进程运行中 (PID: $DAEMON_PID)" echo "$DAEMON_PID" > "$DAEMON_PID_FILE" return 0 else log "❌ inkos 守护进程已停止" return 1 fi } # 检查工作进度 check_progress() { log "📊 检查 inkos 工作进度..." cd "$PROJECT_DIR" 2>/dev/null || { log "错误:无法进入项目目录" return 1 } # 检查书籍状态 BOOK_STATUS=$(inkos book list 2>/dev/null) if [ $? -eq 0 ]; then log "📚 书籍状态:$BOOK_STATUS" else log "⚠️ 无法获取书籍列表" fi # 统计章节数量 CHAPTER_COUNT=0 if [ -d "books" ]; then for book_dir in books/*/; do if [ -d "${book_dir}chapters" ]; then COUNT=$(find "${book_dir}chapters" -name "*.md" -o -name "*.json" 2>/dev/null | wc -l) BOOK_NAME=$(basename "$book_dir") CHAPTER_COUNT=$((CHAPTER_COUNT + COUNT)) log " 📖 书籍 '$BOOK_NAME': $COUNT 个章节" # 显示最新章节 LATEST_CHAPTER=$(find "${book_dir}chapters" -name "*.md" 2>/dev/null | sort | tail -1) if [ -n "$LATEST_CHAPTER" ]; then CHAPTER_NAME=$(basename "$LATEST_CHAPTER" .md) log " 最新章节: $CHAPTER_NAME" # 显示章节字数 if [ -f "$LATEST_CHAPTER" ]; then WORD_COUNT=$(wc -w < "$LATEST_CHAPTER" 2>/dev/null) CHAR_COUNT=$(wc -m < "$LATEST_CHAPTER" 2>/dev/null) log " 字数: ${WORD_COUNT}字 (${CHAR_COUNT}字符)" fi fi fi done fi log "📈 总计章节: $CHAPTER_COUNT" # 检查守护进程日志 if [ -f "/tmp/inkos-daemon.log" ]; then LOG_LINES=$(tail -5 "/tmp/inkos-daemon.log" 2>/dev/null) if [ -n "$LOG_LINES" ]; then log "📝 最近日志:" echo "$LOG_LINES" | while IFS= read -r line; do log " $line" done fi fi return 0 } # 修复常见问题 fix_issues() { log "🔧 诊断并修复问题..." cd "$PROJECT_DIR" 2>/dev/null || { log "错误:无法进入项目目录" return 1 } # 1. 检查 API 配置 if [ ! -f ".env" ]; then log "⚠️ 缺少 .env 配置文件,正在创建..." cat > .env << 'EOF' # LLM Configuration INKOS_LLM_PROVIDER=custom INKOS_LLM_BASE_URL=https://ark.cn-beijing.volces.com/api/coding/v3 INKOS_LLM_API_KEY=63589785-b399-47dd-8423-d2433938f169 INKOS_LLM_MODEL=deepseek-v3.2 EOF log "✅ .env 文件已创建" else log "✅ .env 配置文件存在" fi # 2. 检查书籍目录 if [ ! -d "books" ]; then log "⚠️ 缺少 books 目录,正在创建..." mkdir -p books fi # 3. 检查 inkos 配置 if ! inkos status > /dev/null 2>&1; then log "⚠️ inkos 配置有问题,尝试修复..." # 重新初始化项目 if [ -f "inkos.json" ]; then log "✅ inkos.json 存在,项目结构正常" else log "❌ inkos.json 不存在,可能需要重新初始化" fi fi # 4. 检查章节文件完整性 for book_dir in books/*/; do if [ -d "$book_dir" ]; then CHAPTER_DIR="${book_dir}chapters" if [ ! -d "$CHAPTER_DIR" ]; then log "⚠️ 书籍 $(basename "$book_dir") 缺少 chapters 目录,正在创建..." mkdir -p "$CHAPTER_DIR" fi fi done log "🔧 修复完成" } # 重启守护进程 restart_daemon() { log "🔄 重启 inkos 守护进程..." # 停止现有进程 if pgrep -f "inkos up" > /dev/null; then log "停止现有 inkos 进程..." pkill -f "inkos up" sleep 2 fi # 修复问题 fix_issues # 启动新进程 log "启动 inkos 守护进程..." cd "$PROJECT_DIR" && nohup inkos up > /tmp/inkos-daemon.log 2>&1 & # 等待启动 sleep 5 # 验证启动 if check_daemon; then log "✅ inkos 守护进程重启成功" return 0 else log "❌ inkos 守护进程启动失败" return 1 fi } # 主监控函数 main_monitor() { log "="*60 log "🦠 inkos 监控开始运行" # 检查守护进程 if ! check_daemon; then log "⚠️ 检测到 inkos 守护进程停止,正在尝试修复并重启..." if restart_daemon; then log "✅ 修复重启成功" else log "❌ 修复重启失败,可能需要人工干预" fi else log "✅ inkos 守护进程正常运行" fi # 检查工作进度 check_progress log "🦠 inkos 监控运行完成" log "="*60 } # 执行监控 main_monitor