#!/bin/bash # Agent 服务管理脚本 # 服务配置 SERVICE_NAME="knowledge-agent" PID_FILE="/tmp/${SERVICE_NAME}.pid" LOG_FILE="logs/agent.log" PORT=8080 # 创建日志目录 mkdir -p logs # 显示帮助信息 show_help() { echo "Usage: $0 {start|stop|restart|status|logs}" echo "" echo "Commands:" echo " start - 启动服务" echo " stop - 停止服务" echo " restart - 重启服务" echo " status - 查看服务状态" echo " logs - 查看实时日志" echo "" echo "Examples:" echo " $0 start # 启动服务" echo " $0 stop # 停止服务" echo " $0 logs # 查看实时日志" echo " tail -f logs/agent.log # 也可以直接使用 tail 命令" } # 检查服务是否运行 is_running() { if [ -f "$PID_FILE" ]; then pid=$(cat "$PID_FILE") if ps -p "$pid" > /dev/null 2>&1; then return 0 else rm -f "$PID_FILE" fi fi return 1 } # 启动服务 start_service() { echo "🚀 启动 ${SERVICE_NAME} 服务..." # 检查Python环境 if ! command -v python3 &> /dev/null; then echo "❌ 错误: 未找到 python3 命令" exit 1 fi # 检查依赖 echo "📦 检查依赖..." python3 -c "import fastapi, uvicorn" 2>/dev/null if [ $? -ne 0 ]; then echo "❌ 错误: 缺少必要的依赖包" echo "请运行: pip install -r requirements.txt" exit 1 fi # 检查 LangGraph echo "🔍 检查 LangGraph..." python3 -c "import langgraph" 2>/dev/null if [ $? -ne 0 ]; then echo "⚠️ 警告: LangGraph 未安装,将使用传统模式" echo "如需启用 LangGraph,请运行: pip install langgraph" echo "" fi # 检查服务是否已经运行 if is_running; then echo "⚠️ 警告: 服务已经在运行中 (PID: $(cat "$PID_FILE"))" echo "如需重启,请使用: $0 restart" exit 1 fi # 启动服务 echo "🌟 启动服务..." echo "📍 服务地址: http://localhost:${PORT}" echo "📚 API文档: http://localhost:${PORT}/docs" echo "🔍 健康检查: http://localhost:${PORT}/health" echo "📝 日志文件: ${LOG_FILE}" echo "" # 后台启动服务,记录PID nohup python3 agent.py > "$LOG_FILE" 2>&1 & echo $! > "$PID_FILE" # 等待服务启动 sleep 2 if is_running; then echo "✅ 服务启动成功! (PID: $(cat "$PID_FILE"))" echo "📝 查看日志: $0 logs 或 tail -f ${LOG_FILE}" echo "🛑 停止服务: $0 stop" else echo "❌ 服务启动失败,请检查日志: ${LOG_FILE}" rm -f "$PID_FILE" exit 1 fi } # 停止服务 stop_service() { echo "🛑 停止 ${SERVICE_NAME} 服务..." if is_running; then pid=$(cat "$PID_FILE") echo "正在停止进程 PID: $pid" # 尝试优雅停止 kill "$pid" 2>/dev/null # 等待进程结束 for i in {1..10}; do if ! ps -p "$pid" > /dev/null 2>&1; then break fi echo "等待进程结束... ($i/10)" sleep 1 done # 如果进程仍然存在,强制杀死 if ps -p "$pid" > /dev/null 2>&1; then echo "强制停止进程..." kill -9 "$pid" 2>/dev/null fi rm -f "$PID_FILE" echo "✅ 服务已停止" else echo "ℹ️ 服务未运行" fi } # 重启服务 restart_service() { echo "🔄 重启 ${SERVICE_NAME} 服务..." stop_service sleep 2 start_service } # 查看服务状态 show_status() { echo "🔍 ${SERVICE_NAME} 服务状态:" if is_running; then pid=$(cat "$PID_FILE") echo "✅ 状态: 运行中" echo "📊 PID: $pid" echo "📍 端口: $PORT" echo "📝 日志: $LOG_FILE" echo "🔗 地址: http://localhost:${PORT}" # 显示进程信息 echo "" echo "📋 进程信息:" ps -p "$pid" -o pid,ppid,cmd,etime else echo "❌ 状态: 未运行" echo "💡 启动服务: $0 start" fi } # 查看实时日志 show_logs() { echo "📝 查看实时日志 (按 Ctrl+C 退出)..." echo "日志文件: ${LOG_FILE}" echo "" if [ -f "$LOG_FILE" ]; then tail -f "$LOG_FILE" else echo "❌ 日志文件不存在: ${LOG_FILE}" echo "请先启动服务: $0 start" exit 1 fi } # 主逻辑 case "$1" in start) start_service ;; stop) stop_service ;; restart) restart_service ;; status) show_status ;; logs) show_logs ;; *) show_help exit 1 ;; esac