restart.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #!/bin/bash
  2. # ============================================================
  3. # Restart script for GuessWhoAmI
  4. # Backend: FastAPI on port 8000
  5. # Frontend: Python http.server on port 3000
  6. # ============================================================
  7. set -e
  8. PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
  9. BACKEND_DIR="$PROJECT_DIR/backend"
  10. FRONTEND_DIR="$PROJECT_DIR/frontend"
  11. # python解释器路径
  12. VENV_PYTHON="/home/afei/hello_agent_venv/bin/python"
  13. BACKEND_PORT=8000
  14. FRONTEND_PORT=3000
  15. LOG_DIR="$PROJECT_DIR/logs"
  16. mkdir -p "$LOG_DIR"
  17. BACKEND_LOG="$LOG_DIR/backend.log"
  18. FRONTEND_LOG="$LOG_DIR/frontend.log"
  19. # ── Color helpers ──────────────────────────────────────────
  20. GREEN='\033[0;32m'
  21. YELLOW='\033[1;33m'
  22. RED='\033[0;31m'
  23. NC='\033[0m'
  24. info() { echo -e "${GREEN}[INFO]${NC} $*"; }
  25. warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
  26. error() { echo -e "${RED}[ERROR]${NC} $*"; }
  27. # ── Kill processes on a given port ─────────────────────────
  28. kill_port() {
  29. local port=$1
  30. local pids
  31. pids=$(lsof -ti tcp:"$port" 2>/dev/null || true)
  32. if [ -n "$pids" ]; then
  33. echo "$pids" | xargs kill -9 2>/dev/null || true
  34. warn "Killed existing process(es) on port $port: $pids"
  35. fi
  36. }
  37. # ── Also kill by process name pattern ──────────────────────
  38. kill_pattern() {
  39. local pattern=$1
  40. local pids
  41. pids=$(pgrep -f "$pattern" 2>/dev/null || true)
  42. if [ -n "$pids" ]; then
  43. echo "$pids" | xargs kill -9 2>/dev/null || true
  44. warn "Killed process(es) matching '$pattern': $pids"
  45. fi
  46. }
  47. # ── Wait for a port to become available ────────────────────
  48. wait_for_port() {
  49. local port=$1
  50. local name=$2
  51. local max_wait=15
  52. local count=0
  53. while ! lsof -ti tcp:"$port" >/dev/null 2>&1; do
  54. sleep 1
  55. count=$((count + 1))
  56. if [ "$count" -ge "$max_wait" ]; then
  57. error "$name failed to start on port $port within ${max_wait}s"
  58. error "Check log: $LOG_DIR/${name,,}.log"
  59. exit 1
  60. fi
  61. done
  62. info "$name is up on port $port ✓"
  63. }
  64. # ══════════════════════════════════════════════════════════
  65. echo ""
  66. echo "╔══════════════════════════════════════════════╗"
  67. echo "║ GuessWhoAmI — Restart Script ║"
  68. echo "╚══════════════════════════════════════════════╝"
  69. echo ""
  70. # ── Step 1: Stop existing services ────────────────────────
  71. info "Stopping existing services..."
  72. kill_port "$BACKEND_PORT"
  73. kill_port "$FRONTEND_PORT"
  74. kill_pattern "main.py"
  75. kill_pattern "GuessWhoAmI/frontend"
  76. sleep 1
  77. # ── Step 2: Start backend ──────────────────────────────────
  78. info "Starting backend (port $BACKEND_PORT)..."
  79. # backend.log is managed by Python's FileHandler; stdout/stderr go to /dev/null
  80. cd "$BACKEND_DIR"
  81. nohup "$VENV_PYTHON" main.py > /dev/null 2>&1 &
  82. BACKEND_PID=$!
  83. info "Backend PID: $BACKEND_PID"
  84. wait_for_port "$BACKEND_PORT" "Backend"
  85. # ── Step 3: Start frontend ─────────────────────────────────
  86. info "Starting frontend (port $FRONTEND_PORT)..."
  87. > "$FRONTEND_LOG" # clear log on each restart
  88. cd "$FRONTEND_DIR"
  89. nohup "$VENV_PYTHON" -m http.server "$FRONTEND_PORT" > "$FRONTEND_LOG" 2>&1 &
  90. FRONTEND_PID=$!
  91. info "Frontend PID: $FRONTEND_PID"
  92. wait_for_port "$FRONTEND_PORT" "Frontend"
  93. # ── Done ───────────────────────────────────────────────────
  94. echo ""
  95. echo -e "${GREEN}✅ All services started successfully!${NC}"
  96. echo ""
  97. echo " 🔧 Backend → http://localhost:$BACKEND_PORT"
  98. echo " 🔧 API Docs → http://localhost:$BACKEND_PORT/docs"
  99. echo " 🌐 Frontend → http://localhost:$FRONTEND_PORT"
  100. echo ""
  101. echo " 📄 Logs:"
  102. echo " Backend : $BACKEND_LOG"
  103. echo " Frontend : $FRONTEND_LOG"
  104. echo ""
  105. echo " To stop all services:"
  106. echo " kill $BACKEND_PID $FRONTEND_PID"
  107. echo " Or run: bash $PROJECT_DIR/stop.sh"
  108. echo ""