#!/bin/bash # LangGraph 本地启动脚本(测试环境 AI 智能体) # 用法: ./start.sh # 启动/重启服务(端口 9000) # ./start.sh stop # 停止服务 # # 说明: # - 服务: app.main:app(FastAPI + LangGraph + ChromaDB + faster-whisper) # - 端口: 9000(后端 application.yml 的 langgraph.base-url 默认指向 http://localhost:9000) # - ChromaDB 依赖 sqlite3>=3.35,本机系统 sqlite 3.26 → 由 .venv site-packages/sitecustomize.py # 用 pysqlite3 兜底(ChromaDB 官方 workaround,已在 venv 内生效) # - AxonHub 网关无 embedding 模型 → 关闭知识库定时同步(KB_SYNC_ENABLED=false), # 避免每小时报错刷屏;RAG/记忆调用被应用层 try/except 兜底 set -euo pipefail cd "$(dirname "$0")" PORT="${SERVICE_PORT:-9000}" LOG_FILE="${LANGGRAPH_LOG:-/sc-data/cfc/cfc-langgraph/langgraph.log}" PID_FILE=".langgraph.pid" stop() { if [ -f "$PID_FILE" ]; then local pid pid=$(cat "$PID_FILE") if kill -0 "$pid" 2>/dev/null; then echo "停止 langgraph (PID=$pid)..." kill "$pid" 2>/dev/null || true sleep 3 kill -0 "$pid" 2>/dev/null && kill -9 "$pid" 2>/dev/null || true fi rm -f "$PID_FILE" fi } start() { # 已在运行则不重复启动 if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then echo "langgraph 已在运行 (PID=$(cat "$PID_FILE")),端口 $PORT" return 0 fi export KB_SYNC_ENABLED="${KB_SYNC_ENABLED:-false}" # setsid 脱离当前会话/进程组,避免 shell 命令结束时被 killpg 连带终止 setsid nohup .venv/bin/python -m uvicorn app.main:app \ --host 0.0.0.0 --port "$PORT" \ --workers 1 --log-level info \ >> "$LOG_FILE" 2>&1 < /dev/null & echo $! > "$PID_FILE" echo "启动 langgraph (PID=$!),日志: $LOG_FILE,端口 $PORT" } case "${1:-start}" in stop) stop ;; restart) stop; sleep 1; start ;; *) start ;; esac