start.sh 1.9 KB

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