magicciv/tools/run-services.sh
Natalie 21d757a20f feat(@projects/@magic-civilization): add tile placement preview mode
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-04-25 23:35:18 -07:00

110 lines
3.1 KiB
Bash
Executable file

#!/usr/bin/env bash
# run-services.sh — Manage the mc-magic-civilization background services.
#
# Usage:
# tools/run-services.sh services:up — start mcts-server (idempotent)
# tools/run-services.sh services:down — stop mcts-server
# tools/run-services.sh services:status — print service status
#
# Environment:
# MCTS_SOCKET_PATH — Unix socket path (default: /tmp/mc-mcts.sock)
# MCTS_SERVER_BIN — Path to mcts-server binary (default: search PATH, then
# src/simulator/target/release/mcts-server)
# MC_RUN_DIR — Directory for PID and log files
# (default: <repo-root>/.local/run)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
MCTS_SOCKET_PATH="${MCTS_SOCKET_PATH:-/tmp/mc-mcts.sock}"
MC_RUN_DIR="${MC_RUN_DIR:-$PROJECT_DIR/.local/run}"
PID_FILE="$MC_RUN_DIR/mcts-server.pid"
LOG_FILE="$MC_RUN_DIR/mcts-server.log"
_find_mcts_server() {
# 1. Caller-supplied path.
if [ -n "${MCTS_SERVER_BIN:-}" ] && [ -x "$MCTS_SERVER_BIN" ]; then
echo "$MCTS_SERVER_BIN"
return 0
fi
# 2. On PATH.
if command -v mcts-server >/dev/null 2>&1; then
command -v mcts-server
return 0
fi
# 3. Release build next to simulator workspace.
local release_bin="$PROJECT_DIR/src/simulator/target/release/mcts-server"
if [ -x "$release_bin" ]; then
echo "$release_bin"
return 0
fi
return 1
}
_is_running() {
[ -f "$PID_FILE" ] || return 1
local pid
pid="$(cat "$PID_FILE")"
kill -0 "$pid" 2>/dev/null
}
_cmd_up() {
if _is_running; then
local pid
pid="$(cat "$PID_FILE")"
echo "mcts-server already running (pid $pid)"
return 0
fi
local bin
if ! bin="$(_find_mcts_server)"; then
echo "ERROR: mcts-server binary not found." >&2
echo " Build it with: cd src/simulator && cargo build --release -p mc-mcts-service" >&2
echo " Or set MCTS_SERVER_BIN=/path/to/mcts-server" >&2
exit 1
fi
mkdir -p "$MC_RUN_DIR"
echo "Starting mcts-server ($bin) → socket $MCTS_SOCKET_PATH"
nohup "$bin" "$MCTS_SOCKET_PATH" >> "$LOG_FILE" 2>&1 &
local pid=$!
echo "$pid" > "$PID_FILE"
echo "mcts-server started (pid $pid, log: $LOG_FILE)"
}
_cmd_down() {
if ! _is_running; then
echo "mcts-server not running"
rm -f "$PID_FILE"
return 0
fi
local pid
pid="$(cat "$PID_FILE")"
kill -TERM "$pid" 2>/dev/null || true
rm -f "$PID_FILE"
echo "mcts-server stopped (pid $pid)"
}
_cmd_status() {
if _is_running; then
local pid
pid="$(cat "$PID_FILE")"
echo "mcts-server running (pid $pid, socket: $MCTS_SOCKET_PATH)"
else
echo "mcts-server not running"
rm -f "$PID_FILE" 2>/dev/null || true
fi
}
CMD="${1:-}"
case "$CMD" in
services:up) _cmd_up ;;
services:down) _cmd_down ;;
services:status) _cmd_status ;;
*)
echo "Usage: $0 {services:up|services:down|services:status}" >&2
exit 1
;;
esac