#!/bin/sh # --------------------------------------------------------------------------- # run-server.sh # # Keeps FXServer alive and gives it a console you can talk to. # # * FXServer reads its console from stdin and quits the moment stdin hits # EOF, so it gets a FIFO whose write end this script holds open. That FIFO # doubles as the command channel used by bin/rcon. # * A server that dies instantly is usually failing for a reason that will # not fix itself (bad licence key, database down). The restart delay backs # off to 5 minutes so a broken server does not hammer Cfx, and resets once # it has stayed up for a while. # --------------------------------------------------------------------------- NAME="$1"; DIR="$2"; LOG="$3" FIFO="/run/$NAME.stdin" MIN=5; MAX=300; HEALTHY=120 mkdir -p "$(dirname "$LOG")" echo $$ > "/run/$NAME.sup.pid" [ -p "$FIFO" ] || { rm -f "$FIFO"; mkfifo "$FIFO"; } exec 9<> "$FIFO" cleanup() { kill "$CHILD" 2>/dev/null; rm -f "/run/$NAME.sup.pid" "/run/$NAME.child.pid"; exit 0; } trap cleanup TERM INT delay=$MIN while true; do if [ -f "$LOG" ] && [ "$(stat -c %s "$LOG")" -gt 209715200 ]; then mv "$LOG" "$LOG.1"; fi echo "=== $(date -Is) starting $NAME ===" >> "$LOG" started=$(date +%s) ( cd "$DIR/server-data" && exec "$DIR/server/run.sh" +exec server.cfg ) >> "$LOG" 2>&1 <&9 & CHILD=$! echo $CHILD > "/run/$NAME.child.pid" wait $CHILD RC=$? ran=$(( $(date +%s) - started )) if [ "$ran" -ge "$HEALTHY" ]; then delay=$MIN; else delay=$(( delay * 2 )); [ "$delay" -gt "$MAX" ] && delay=$MAX; fi echo "=== $(date -Is) $NAME exited (rc=$RC) after ${ran}s, restarting in ${delay}s ===" >> "$LOG" sleep "$delay" done