From fa721516984fecbb8d6a01020e230a7b224e557a Mon Sep 17 00:00:00 2001 From: UzixLS Date: Sat, 14 Feb 2015 12:57:46 +0300 Subject: [PATCH] adapted to work under supervisor (systemd/upstart/daemon/etc) --- run.sh | 126 +++++++++++++++++++++++++-------------------------------- 1 file changed, 55 insertions(+), 71 deletions(-) diff --git a/run.sh b/run.sh index 9a7bf08..a9bea88 100755 --- a/run.sh +++ b/run.sh @@ -1,77 +1,61 @@ -#!/usr/bin/env bash -# Run script for armagetron server. +#!/bin/sh PROGDIR=/opt/arma -HOMDIR=/var/games/arma/$2 -#test $(id -u) = 0 && su armagetron +HOMDIR=/var/games/arma/$1 -case "$1" in - start|stop|restart|rehash|status) - if [ -z "$2" ]; then echo "Please, give me servername."; exit 1; fi - if [ ! -r "$HOMDIR" ]; then echo "Cannot read $HOMDIR"; exit 3; fi - ;; -esac; case "$1" in - status) - echo "Status for armagetron ($2): " - echo -n ' Server: ' - if [ ! -r "$HOMDIR/var/pid" ]; then echo "cannot read PID file ($HOMDIR/var/pid)"; exit 2; fi - echo -n $(cat "$HOMDIR/var/pid")" " - if [ -r /proc/$(cat "$HOMDIR/var/pid") ]; then echo "ok"; else echo "fail"; fi +if [ -z "$1" ]; then echo "Usage: $0 "; exit 1; fi +if [ ! -r "$HOMDIR" ]; then echo "$0: cannot read $HOMDIR"; exit 3; fi - echo -n ' Armatop: ' - if [ ! -r "$HOMDIR/var/pid.armatop" ]; then echo "cannot read PID file ($HOMDIR/var/pid.armatop)"; exit 2; fi - echo -n $(cat "$HOMDIR/var/pid.armatop")" " - if [ -r /proc/$(cat "$HOMDIR/var/pid") ]; then echo "ok"; else echo "fail"; fi - ;; - stop) - echo -n "Stopping armagetron ($2): " - if [ ! -r "$HOMDIR/var/pid" ]; then - echo "Cannot read PID file ($HOMDIR/var/pid)" - exit 2 - fi - echo -n $(cat "$HOMDIR/var/pid")" " - kill $(cat "$HOMDIR/var/pid") 2>/dev/null - if [ ! -r "$HOMDIR/var/pid.armatop" ]; then - echo "Cannot read PID file ($HOMDIR/var/pid.armatop)" - exit 2 - fi - echo -n $(cat "$HOMDIR/var/pid.armatop")" " - kill $(cat "$HOMDIR/var/pid.armatop") 2>/dev/null - echo . - ;; - start) - echo -n "Starting armagetron ($2): " - touch "$HOMDIR/var/ladderlog.txt" "$HOMDIR/var/won_rounds.txt" "$HOMDIR/var/won_matches.txt" - test -e "$HOMDIR/var/commands" && rm "$HOMDIR/var/commands" ; mkfifo "$HOMDIR/var/commands" +touch "$HOMDIR/var/ladderlog.txt" "$HOMDIR/var/won_rounds.txt" "$HOMDIR/var/won_matches.txt" +test -e "$HOMDIR/var/commands" && rm "$HOMDIR/var/commands" ; mkfifo "$HOMDIR/var/commands" - nice -n 2 perl -T $PROGDIR/scripts/armatop.pl --workdir="$HOMDIR/var" & - echo -n "$! "; echo -n $! >"$HOMDIR/var/pid.armatop" - while true; do - env LD_LIBRARY_PATH=/opt/arma/lib/ $PROGDIR/bin/armagetronad-dedicated\ - --userdatadir "$HOMDIR" --input "$HOMDIR/var/commands" >"$HOMDIR/var/log" 2>&1 & - trap "kill %1; exit;" TERM INT - trap "kill -HUP %1; wait %1;" HUP - wait %1 - sleep 3 - done & - echo -n "$! "; echo -n $! >"$HOMDIR/var/pid" - echo . - ;; - restart) - "$0" stop "$2" && "$0" start "$2" - ;; - rehash) - echo -n "Rehashing armagetron ($2): " - if [ ! -r "$HOMDIR/var/pid" ]; then - echo "Cannot read PID file ($HOMDIR/var/pid)" - exit 2 - fi - echo -n $(cat "$HOMDIR/var/pid")" " - kill -HUP $(cat "$HOMDIR/var/pid") 2>/dev/null - echo . - ;; - *) - echo "Unknown parameters. Try to use \"$0 \"" - ;; -esac +start() { + if pgrep -f -- "--userdatadir $HOMDIR" >/dev/null ; then + echo "$0: $HOMDIR already in use" + exit 2 + fi + + nice -n 2 perl -T $PROGDIR/scripts/armatop.pl --workdir="$HOMDIR/var" & + echo -n $! >"$HOMDIR/var/pid.armatop" + + $PROGDIR/bin/armagetronad-dedicated --userdatadir "$HOMDIR" --input "$HOMDIR/var/commands" >"$HOMDIR/var/log" 2>&1 & + echo -n $! >"$HOMDIR/var/pid.core" +} + +reload() { + test -r $HOMDIR/var/pid.core && kill -HUP `cat $HOMDIR/var/pid.core` +} + +stoppid() { + p=$1 + if [ -r $p ]; then + for i in `seq 10`; do + if ps `cat $p` >/dev/null; then + kill `cat $p` + else + break + fi + sleep 1 + done + if ps `cat $p` >/dev/null; then + kill -9 `cat $p` + fi + rm $p + fi +} + +stop() { + stoppid $HOMDIR/var/pid.armatop + stoppid $HOMDIR/var/pid.core + exit $1 +} + +trap ":;stop" TERM INT EXIT +trap ":;reload" HUP + +echo -n $$ >"$HOMDIR/var/pid" + +start +while jobs %2 >/dev/null 2>&1; do sleep 1; done +stop 1