From 4d4f4888638d3d4899c566eed46b0d18db242f7b Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Wed, 13 Jul 2016 23:08:19 +1000 Subject: [PATCH] Improve restart behaviour using pid files --- tools/arkmanager | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/tools/arkmanager b/tools/arkmanager index 3197a44..bf672e3 100755 --- a/tools/arkmanager +++ b/tools/arkmanager @@ -151,6 +151,8 @@ arkserverLog="arkserver.log" # here is logged the output of ShooterGameServer appid="${appid:-376030}" mod_appid="${mod_appid:-346110}" arkautorestartfile="${arkautorestartfile:-ShooterGame/Saved/.autorestart}" +arkserverpidfile="${arkserverpidfile:-ShooterGame/Saved/.arkserver.pid}" +arkmanagerpidfile="${arkmanagerpidfile:-ShooterGame/Saved/.arkmanager.pid}" install_bindir="${install_bindir:-${0%/*}}" install_libexecdir="${install_libexecdir:-${install_bindir%/*}/libexec/arkmanager}" @@ -507,6 +509,13 @@ function getAvailableVersion(){ # Get the PID of the server process # function getServerPID(){ + if [ -f "${arkserverroot}/${arkserverpidfile}" ]; then + serverpid="$(<"${arkserverroot}/${arkserverpidfile}")" + if kill -0 "$serverpid" >/dev/null 2>&1; then + echo $serverpid + return + fi + fi ps -ef | grep "$arkserverroot/$arkserverexec" | grep -v grep | awk '{print $2}' } @@ -610,6 +619,14 @@ function numPlayersConnected(){ doRun() { cd "${arkserverroot}/${arkserverexec%/*}" + if isTheServerRunning; then + echo "Error: another server instance is running from the same directory" + echo "Aborting - two servers MUST NOT run from the same directory" + exit 1 + fi + + echo "$$" >"${arkserverroot}/${arkmanagerpidfile}" + arkserveropts="$serverMap" if [ -n "$serverMapModId" ]; then @@ -722,10 +739,11 @@ doRun() { # Shutdown the server when we are terminated shutdown_server(){ restartserver=0 - rm "$arkserverroot/$arkautorestartfile" + rm -f "$arkserverroot/$arkautorestartfile" if [ "$serverpid" -ne 0 ]; then - kill -INT $serverpid + kill -INT $serverpid >/dev/null 2>&1 fi + exit 0 } trap shutdown_server INT TERM @@ -739,6 +757,7 @@ doRun() { "$arkserverroot/$arkserverexec" "$arkserveropts" "${arkextraopts[@]}" & # Grab the server PID serverpid=$! + echo "$serverpid" >"${arkserverroot}/${arkserverpidfile}" echo "`timestamp`: Server PID: $serverpid" # Disable auto-restart so we don't get caught in a restart loop rm -f "$arkserverroot/$arkautorestartfile" @@ -767,8 +786,6 @@ doRun() { echo "`timestamp`: Bad PID '$pid'; expected '$serverpid'" if [ "$pid" != "" ]; then # Another instance must be running - disable autorestart - echo "Error: another server instance is running from the same directory" - echo "Aborting - two servers MUST NOT run from the same directory" restartserver=0 fi break @@ -882,6 +899,13 @@ doStop() { kill -KILL $PID fi + if [ -f "${arkserverroot}/${arkmanagerpidfile}" ]; then + PID="$(<"${arkserverroot}/${arkmanagerpidfile}")" + if [ -n "$PID" ]; then + kill $PID + fi + fi + tput rc; tput ed; echo "The server has been stopped" echo "`timestamp`: stopped" >> "$logdir/$arkmanagerLog"