stop-server.sh 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/env bash
  2. # Stop the brainstorm server and clean up
  3. # Usage: stop-server.sh <session_dir>
  4. #
  5. # Kills the server process. Only deletes session directory if it's
  6. # under /tmp (ephemeral). Persistent directories (.superpowers/) are
  7. # kept so mockups can be reviewed later.
  8. SESSION_DIR="$1"
  9. if [[ -z "$SESSION_DIR" ]]; then
  10. echo '{"error": "Usage: stop-server.sh <session_dir>"}'
  11. exit 1
  12. fi
  13. STATE_DIR="${SESSION_DIR}/state"
  14. PID_FILE="${STATE_DIR}/server.pid"
  15. if [[ -f "$PID_FILE" ]]; then
  16. pid=$(cat "$PID_FILE")
  17. # Try to stop gracefully, fallback to force if still alive
  18. kill "$pid" 2>/dev/null || true
  19. # Wait for graceful shutdown (up to ~2s)
  20. for i in {1..20}; do
  21. if ! kill -0 "$pid" 2>/dev/null; then
  22. break
  23. fi
  24. sleep 0.1
  25. done
  26. # If still running, escalate to SIGKILL
  27. if kill -0 "$pid" 2>/dev/null; then
  28. kill -9 "$pid" 2>/dev/null || true
  29. # Give SIGKILL a moment to take effect
  30. sleep 0.1
  31. fi
  32. if kill -0 "$pid" 2>/dev/null; then
  33. echo '{"status": "failed", "error": "process still running"}'
  34. exit 1
  35. fi
  36. rm -f "$PID_FILE" "${STATE_DIR}/server.log"
  37. # Only delete ephemeral /tmp directories
  38. if [[ "$SESSION_DIR" == /tmp/* ]]; then
  39. rm -rf "$SESSION_DIR"
  40. fi
  41. echo '{"status": "stopped"}'
  42. else
  43. echo '{"status": "not_running"}'
  44. fi