stop-server.sh 1.2 KB

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