200 lines
5.5 KiB
Bash
200 lines
5.5 KiB
Bash
|
|
#!/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
|