#!/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: /.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