110 lines
3.1 KiB
Bash
Executable file
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
|