strat-gameplay-webapp/stop-services.sh
Cal Corum 27b502a7ad CLAUDE: Add exception tests and enhance stop-services script
New Tests:
- test_exceptions.py: Comprehensive tests for custom GameEngineError
  hierarchy including AuthorizationError, DatabaseError, etc.

Scripts:
- stop-services.sh: Enhanced to kill entire process trees and
  clean up orphan processes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 12:10:59 -06:00

114 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
# Stop both backend and frontend services
# Enhanced to kill entire process trees and clean up orphans
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_DIR="$SCRIPT_DIR/logs"
echo "🛑 Stopping SBA Gameplay Services..."
echo ""
# Function to kill process tree
kill_tree() {
local pid=$1
local sig=${2:-TERM}
# Get all child PIDs
local children=$(pgrep -P "$pid" 2>/dev/null || true)
# Kill children first
for child in $children; do
kill_tree "$child" "$sig"
done
# Kill the parent
if ps -p "$pid" > /dev/null 2>&1; then
kill -"$sig" "$pid" 2>/dev/null || true
fi
}
# Stop Backend
if [ -f "$LOG_DIR/backend.pid" ]; then
BACKEND_PID=$(cat "$LOG_DIR/backend.pid")
if ps -p "$BACKEND_PID" > /dev/null 2>&1; then
echo "📡 Stopping Backend (PID: $BACKEND_PID)..."
kill_tree "$BACKEND_PID" TERM
sleep 1
# Force kill if still running
if ps -p "$BACKEND_PID" > /dev/null 2>&1; then
kill_tree "$BACKEND_PID" KILL
fi
echo " ✓ Backend stopped"
else
echo " ⚠ Backend process not found"
fi
rm -f "$LOG_DIR/backend.pid"
else
echo " ⚠ No backend PID file found"
fi
echo ""
# Stop Frontend
if [ -f "$LOG_DIR/frontend.pid" ]; then
FRONTEND_PID=$(cat "$LOG_DIR/frontend.pid")
if ps -p "$FRONTEND_PID" > /dev/null 2>&1; then
echo "🎨 Stopping Frontend (PID: $FRONTEND_PID)..."
kill_tree "$FRONTEND_PID" TERM
sleep 1
# Force kill if still running
if ps -p "$FRONTEND_PID" > /dev/null 2>&1; then
kill_tree "$FRONTEND_PID" KILL
fi
echo " ✓ Frontend stopped"
else
echo " ⚠ Frontend process not found"
fi
rm -f "$LOG_DIR/frontend.pid"
else
echo " ⚠ No frontend PID file found"
fi
echo ""
# Aggressive cleanup: kill ALL related processes by pattern matching
echo "🔍 Checking for any remaining processes..."
# Kill all backend processes for this app (uvicorn OR python -m app.main)
BACKEND_PIDS=$(pgrep -f "python.*app\.main" 2>/dev/null || true)
UVICORN_PIDS=$(pgrep -f "uvicorn.*app\.main" 2>/dev/null || true)
ALL_BACKEND_PIDS="$BACKEND_PIDS $UVICORN_PIDS"
ALL_BACKEND_PIDS=$(echo "$ALL_BACKEND_PIDS" | tr ' ' '\n' | sort -u | tr '\n' ' ' | xargs)
if [ -n "$ALL_BACKEND_PIDS" ]; then
echo " Found orphaned backend processes: $ALL_BACKEND_PIDS"
for pid in $ALL_BACKEND_PIDS; do
kill_tree "$pid" KILL
done
echo " ✓ Killed orphaned backend processes"
fi
# Also kill any processes on port 8000
PORT_8000_PIDS=$(lsof -ti :8000 2>/dev/null || true)
if [ -n "$PORT_8000_PIDS" ]; then
echo " Found processes on port 8000: $PORT_8000_PIDS"
for pid in $PORT_8000_PIDS; do
kill -9 "$pid" 2>/dev/null || true
done
echo " ✓ Killed processes on port 8000"
fi
# Kill all nuxt dev processes in this directory
FRONTEND_PIDS=$(pgrep -f "nuxt.*dev" | while read pid; do
if ps -p $pid -o args= | grep -q "$SCRIPT_DIR/frontend-sba"; then
echo $pid
fi
done)
if [ -n "$FRONTEND_PIDS" ]; then
echo " Found orphaned frontend processes: $FRONTEND_PIDS"
for pid in $FRONTEND_PIDS; do
kill_tree "$pid" KILL
done
echo " ✓ Killed orphaned frontend processes"
fi
echo "✅ Services stopped successfully!"