| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #!/bin/bash
- # ============================================================
- # Restart script for GuessWhoAmI
- # Backend: FastAPI on port 8000
- # Frontend: Python http.server on port 3000
- # ============================================================
- set -e
- PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
- BACKEND_DIR="$PROJECT_DIR/backend"
- FRONTEND_DIR="$PROJECT_DIR/frontend"
- # python解释器路径
- VENV_PYTHON="/home/afei/hello_agent_venv/bin/python"
- BACKEND_PORT=8000
- FRONTEND_PORT=3000
- LOG_DIR="$PROJECT_DIR/logs"
- mkdir -p "$LOG_DIR"
- BACKEND_LOG="$LOG_DIR/backend.log"
- FRONTEND_LOG="$LOG_DIR/frontend.log"
- # ── Color helpers ──────────────────────────────────────────
- GREEN='\033[0;32m'
- YELLOW='\033[1;33m'
- RED='\033[0;31m'
- NC='\033[0m'
- info() { echo -e "${GREEN}[INFO]${NC} $*"; }
- warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
- error() { echo -e "${RED}[ERROR]${NC} $*"; }
- # ── Kill processes on a given port ─────────────────────────
- kill_port() {
- local port=$1
- local pids
- pids=$(lsof -ti tcp:"$port" 2>/dev/null || true)
- if [ -n "$pids" ]; then
- echo "$pids" | xargs kill -9 2>/dev/null || true
- warn "Killed existing process(es) on port $port: $pids"
- fi
- }
- # ── Also kill by process name pattern ──────────────────────
- kill_pattern() {
- local pattern=$1
- local pids
- pids=$(pgrep -f "$pattern" 2>/dev/null || true)
- if [ -n "$pids" ]; then
- echo "$pids" | xargs kill -9 2>/dev/null || true
- warn "Killed process(es) matching '$pattern': $pids"
- fi
- }
- # ── Wait for a port to become available ────────────────────
- wait_for_port() {
- local port=$1
- local name=$2
- local max_wait=15
- local count=0
- while ! lsof -ti tcp:"$port" >/dev/null 2>&1; do
- sleep 1
- count=$((count + 1))
- if [ "$count" -ge "$max_wait" ]; then
- error "$name failed to start on port $port within ${max_wait}s"
- error "Check log: $LOG_DIR/${name,,}.log"
- exit 1
- fi
- done
- info "$name is up on port $port ✓"
- }
- # ══════════════════════════════════════════════════════════
- echo ""
- echo "╔══════════════════════════════════════════════╗"
- echo "║ GuessWhoAmI — Restart Script ║"
- echo "╚══════════════════════════════════════════════╝"
- echo ""
- # ── Step 1: Stop existing services ────────────────────────
- info "Stopping existing services..."
- kill_port "$BACKEND_PORT"
- kill_port "$FRONTEND_PORT"
- kill_pattern "main.py"
- kill_pattern "GuessWhoAmI/frontend"
- sleep 1
- # ── Step 2: Start backend ──────────────────────────────────
- info "Starting backend (port $BACKEND_PORT)..."
- # backend.log is managed by Python's FileHandler; stdout/stderr go to /dev/null
- cd "$BACKEND_DIR"
- nohup "$VENV_PYTHON" main.py > /dev/null 2>&1 &
- BACKEND_PID=$!
- info "Backend PID: $BACKEND_PID"
- wait_for_port "$BACKEND_PORT" "Backend"
- # ── Step 3: Start frontend ─────────────────────────────────
- info "Starting frontend (port $FRONTEND_PORT)..."
- > "$FRONTEND_LOG" # clear log on each restart
- cd "$FRONTEND_DIR"
- nohup "$VENV_PYTHON" -m http.server "$FRONTEND_PORT" > "$FRONTEND_LOG" 2>&1 &
- FRONTEND_PID=$!
- info "Frontend PID: $FRONTEND_PID"
- wait_for_port "$FRONTEND_PORT" "Frontend"
- # ── Done ───────────────────────────────────────────────────
- echo ""
- echo -e "${GREEN}✅ All services started successfully!${NC}"
- echo ""
- echo " 🔧 Backend → http://localhost:$BACKEND_PORT"
- echo " 🔧 API Docs → http://localhost:$BACKEND_PORT/docs"
- echo " 🌐 Frontend → http://localhost:$FRONTEND_PORT"
- echo ""
- echo " 📄 Logs:"
- echo " Backend : $BACKEND_LOG"
- echo " Frontend : $FRONTEND_LOG"
- echo ""
- echo " To stop all services:"
- echo " kill $BACKEND_PID $FRONTEND_PID"
- echo " Or run: bash $PROJECT_DIR/stop.sh"
- echo ""
|