#!/bin/sh
#
# Copyright (c) 2004, Valve LLC. All rights reserved.
#
# a wrapper script for the main Source engine dedicated server binary.
# Performs auto-restarting of the server on crash. You can
# extend this to log crashes and more.
#
# setup the libraries, local dir first!
export LD_LIBRARY_PATH=".:bin:$LD_LIBRARY_PATH"
# The srcds_run script should be at the top level of the game tree
# Make sure we are in that directory since the script assumes this is the case
cd "`dirname \"$0\"`"
if test `id -u` -eq 0; then
echo
echo
echo "************** WARNING ***************"
echo "Running the dedicated server as root "
echo "is highly discouraged. It is generally"
echo "unnecessary to use root privileges to "
echo "execute the dedicated server. "
echo "**************************************"
echo
echo
timeout=10
while test $timeout -gt 0; do
echo -n "The server will continue to launch in $timeout seconds\r"
timeout=`expr $timeout - 1`
sleep 1
done
fi
init() {
# Initialises the various variables
# Set up the defaults
GAME=""
DEBUG=""
RESTART="yes"
HL=./srcds_linux
HL_DETECT=1
TIMEOUT=10 # time to wait after a crash (in seconds)
CRASH_DEBUG_MSG="email debug.log to linux@valvesoftware.com"
GDB="gdb" # the gdb binary to run
DEBUG_LOG="debug.log"
PID_FILE="" # only needed it DEBUG is set so init later
STEAM=""
PID_FILE_SET=0
STEAMERR=""
SIGINT_ACTION="quit 0" # exit normally on sig int
NO_TRAP=0
AUTO_UPDATE=""
STEAM_USER=""
STEAM_PASSWORD=""
STEAM_VERIFY=0
PARAMS=$*
# Remove any old default pid files
# Cant do this as they may be still running
#rm -f hlds.*.pid
# use the $FORCE environment variable if its set
if test -n "$FORCE" ; then
# Note: command line -binary will override this
HL=$FORCE
HL_DETECT=0
fi
while test $# -gt 0; do
case "$1" in
"+map")
MAP="$2"
shift;;
"-game")
GAME="$2"
shift ;;
"-debug")
DEBUG=1
# Ensure that PID_FILE is set
PID_FILE_SET=1
if test -z "$PID_FILE"; then
PID_FILE="hlds.$$.pid"
fi ;;
"-norestart")
RESTART="" ;;
"-pidfile")
PID_FILE="$2"
PID_FILE_SET=1
shift ;;
"-binary")
HL="$2"
HL_DETECT=0
shift ;;
"-timeout")
TIMEOUT="$2"
shift ;;
"-gdb")
GDB="$2"
shift ;;
"-debuglog")
DEBUG_LOG="$2"
shift ;;
"-consolelog")
CONSOLE_LOG="$2"
shift ;;
"-autoupdate")
AUTO_UPDATE="yes"
RESTART="yes" ;;
"-steamerr")
STEAMERR=1 ;;
"-ignoresigint")
SIGINT_ACTION="" ;;
"-notrap")
NO_TRAP=1 ;;
"-steambin")
STEAM=$2
shift ;;
"-steamuser")
STEAM_USER="$2";
shift ;;
"-steampass")
STEAM_PASSWORD="$2";
shift ;;
"-steamverify")
STEAM_VERIFY=1 ;;
"-help")
# quit with syntax
quit 2
;;
esac
shift
done
# Ensure we have a game specified
if test -z "$GAME"; then
GAME="tf"
PARAMS="$PARAMS -game $GAME"
fi
# Check game directory
if test ! -d "$GAME"; then
echo "ERROR: Invalid game type '$GAME' sepecified."
quit 1
fi
if test -z "$MAP"; then
echo "WARNING: No map specified! Server may not heartbeat."
fi
if test 0 -eq "$NO_TRAP"; then
# Set up the int handler
# N.B. Dont use SIGINT symbolic value
# as its just INT under ksh
trap "$SIGINT_ACTION" 2
fi
# Only detect the CPU if it hasnt been set with
# either environment or command line
if test "$HL_DETECT" -eq 1; then
detectcpu
fi
if test ! -f "$HL"; then
echo "ERROR: Source Engine binary '$HL' not found, exiting"
quit 1
elif test ! -x "$HL"; then
# Could try chmod but dont know what we will be
# chmoding so just fail.
echo "ERROR: Source engine binary '$HL' not executable, exiting"
quit 1
fi
# Setup debugging
if test -n "$DEBUG" ; then
#turn on core dumps :) (if possible)
echo "Enabling debug mode"
if test "unlimited" != `ulimit -c` && test "`ulimit -c`" -eq 0 ; then
ulimit -c 2000
fi
GDB_TEST=`$GDB -v`
if test -z "$GDB_TEST"; then
echo "WARNING: Please install gdb first."
echo " goto http://www.gnu.org/software/gdb/ "
DEBUG="" # turn off debugging cause gdb isn't installed
fi
fi
if test -n "$STEAM_PASSWORD" && test -z "$STEAM_USER"; then
echo "ERROR: You must set both the steam username and password."
quit 1
fi
HL_CMD="$HL $PARAMS"
if test -n "$CONSOLE_LOG" -a -x "bin/logger"; then
HL_CMD="bin/logger $CONSOLE_LOG $HL_CMD"
fi
}
syntax () {
# Prints script syntax
echo "Syntax:"
echo "$0 [-game <game>] [-debug] [-norestart] [-pidfile]"
echo " [-binary <binary>]"
echo " [-timeout <number>] [-gdb <gdb>] [-autoupdate]"
echo " [-steambin] [-steamerr] [-ignoresigint] [-steamuser <username>]"
echo " [-steampass <password>] [-steamverify] [-debuglog <logname>]"
echo "Params:"
echo "-game <game> Specifies the <game> to run. [Default: $DEFAULT_GAME]"
echo "-debug Run debugging on failed servers if possible."
echo "-debuglog <logname> Log debug output to this file."
echo "-consolelog <logname> Log console output to this file."
echo "-norestart Don't attempt to restart failed servers."
echo "-pidfile <pidfile> Use the specified <pidfile> to store the server pid."
echo "-binary <binary> Use the specified binary ( no auto detection ). [Default: $HL]"
echo "-timeout <number> Sleep for <number> seconds before restarting"
echo " a failed server."
echo "-gdb <gdb> Use <dbg> as the debugger of failed servers."
echo "-steambin <path> Path to steam binary."
echo "-steamerr Quit on steam update failure."
echo "-steamuser <username> Use this username for steam updates."
echo "-steampass <password> Use this password for steam updates"
echo " (-steamuser must be specified as well)."
echo "-steamverify Force steam to verify the install on updates"
echo "-ignoresigint Ignore signal INT ( prevents CTRL+C quitting"
echo " the script )."
echo "-notrap Don't use trap. This prevents automatic"
echo " removal of old lock files."
echo ""
echo "Note: All parameters specified as passed through to the server"
echo "including any not listed."
}
debugcore () {
# Debugs any core file if DEBUG is set and
# the exitcode is none 0
exitcode=$1
if test $exitcode -ne 0; then
if test -n "$DEBUG" ; then
echo "bt" > debug.cmds;
echo "info locals" >> debug.cmds;
echo "info registers" >> debug.cmds
echo "info sharedlibrary" >> debug.cmds
echo "disassemble" >> debug.cmds
echo "info frame" >> debug.cmds; # works, but gives an error... must be last
echo "----------------------------------------------" >> $DEBUG_LOG
echo "CRASH: `date`" >> $DEBUG_LOG
echo "Start Line: $HL_CMD" >> $DEBUG_LOG
# check to see if a core was dumped
if test -f core ; then
CORE="core"
elif test -f core.`cat $PID_FILE`; then
CORE=core.`cat $PID_FILE`
elif test -f "$HL.core" ; then
CORE="$HL.core"
fi
if test -n "$CORE"; then
$GDB $HL $CORE -x debug.cmds -batch >> $DEBUG_LOG
fi
echo "End of Source crash report" >> $DEBUG_LOG
echo "----------------------------------------------" >> $DEBUG_LOG
echo $CRASH_DEBUG_MSG
rm debug.cmds
else
echo "Add \"-debug\" to the $0 command line to generate a debug.log to help with solving this problem"
fi
fi
}
detectcpu() {
# Attempts to auto detect the CPU
echo "Auto detecting CPU"
if test "Linux" = `uname`; then
HL=./srcds_linux
echo "Using default binary: $HL"
elif test "FreeBSD" = `uname`; then
HL=./srcds_linux
echo "Using default binary: $HL"
elif test "Darwin" = `uname`; then
echo "Using OSX binary."
HL=./srcds_osx
else
echo "Using default binary: $HL"
fi
}
update() {
updatesingle
}
locatesteam() {
OLDPATH=${PATH}
PATH=..:.:${PATH}
STEAM=`which steam 2>/dev/null`
if test "$?" -gt 0; then
echo "WARNING: Failed to locate steam binary."
else
echo "INFO: Located steam: $STEAM"
fi
PATH=${OLDPATH}
}
updatesingle() {
# Run the steam update
# exits on failure if STEAMERR is set
if test -n "$AUTO_UPDATE"; then
if test -z "$STEAM"; then
locatesteam
fi
if test -f "$STEAM" -a -x "$STEAM"; then
echo "Updating server using Steam."
DEPOT_ROOT=".."
DEPOT_NAME=$GAME
if test "$GAME" = "cstrike"; then
DEPOT_NAME="Counter-Strike Source";
fi
if test "$GAME" = "cstrike_beta"; then
DEPOT_NAME="cssbeta";
fi
if test "$GAME" = "dod"; then
DEPOT_NAME="dods";
fi
CMD="$STEAM -command update -dir $DEPOT_ROOT";
if test 1 -eq "$STEAM_VERIFY"; then
CMD="$CMD -verify_all"
fi
if test -n "$STEAM_USER"; then
CMD="$CMD -username $STEAM_USER";
fi
if test -n "$STEAM_PASSWORD"; then
CMD="$CMD -password $STEAM_PASSWORD";
fi
$CMD -game "$DEPOT_NAME"
if test $? -ne 0; then
if test -n "$STEAMERR"; then
echo "`date`: Steam Update failed, exiting."
quit 1
else
echo "`date`: Steam Update failed, ignoring."
return 0
fi
fi
else
if test -n "$STEAMERR"; then
echo "ERROR: Could not locate steam binary:$STEAM, exiting.";
quit 1
else
echo "WARNING: Could not locate steam binary:$STEAM, ignoring.";
return 0
fi
fi
fi
return 1
}
run() {
# Runs the steam update and server
# Loops if RESTART is set
# Debugs if server failure is detected
# Note: if RESTART is not set then
# 1. DEBUG is set then the server is NOT exec'd
# 2. DEBUG is not set the the server is exec'd
if test -n "$RESTART" ; then
echo "Server will auto-restart if there is a crash."
#loop forever
while true
do
# Update if needed
update
# Run the server
$HL_CMD
retval=$?
if test $retval -eq 0 && test -z "$AUTO_UPDATE"; then
break; # if 0 is returned then just quit
fi
debugcore $retval
echo "`date`: Server restart in $TIMEOUT seconds"
# don't thrash the hard disk if the server dies, wait a little
sleep $TIMEOUT
done # while true
else
# Update if needed
update
# Run the server
if test -z "$DEBUG"; then
# debug not requested we can exec
exec $HL_CMD
else
# debug requested we can't exec
$HL_CMD
debugcore $?
fi
fi
}
quit() {
# Exits with the give error code, 1
# if none specified.
# exit code 2 also prints syntax
exitcode="$1"
# default to failure
if test -z "$exitcode"; then
exitcode=1
fi
case "$exitcode" in
0)
echo "`date`: Server Quit" ;;
2)
syntax ;;
*)
echo "`date`: Server Failed" ;;
esac
# Remove pid file
if test -n "$PID_FILE" && test -f "$PID_FILE" ; then
# The specified pid file
rm -f $PID_FILE
fi
# reset SIGINT and then kill ourselves properly
trap - 2
kill -2 $$
}
# Initialise
init $*
# Run
run
# Quit normally
quit 0
if test -z "$GAME"; then
GAME="tf"
PARAMS="$PARAMS -game $GAME"
fi
while test $# -gt 0; do
case "$1" in
"+map")
MAP="$2"
shift;;
"-game")
GAME="$2"
shift ;;
We use cookies and similar technologies to provide the best experience on our website. You can choose which purposes you consent to. Your choice applies across websites using the same consent framework.
Below you can select which purposes you consent to. Purpose 1 is required for basic website functionality.
Cookies, device or similar online identifiers together with other information can be stored or read on your device for the purposes presented to you.
Ads can be shown to you based on the content you are viewing, the app you are using, your approximate location, or your device type.
A profile can be built about you and your interests to show you personalised ads that are relevant to you.
Personalised ads can be shown to you based on a profile about you.
A profile can be built about you and your interests to show you personalised content that is relevant to you.
Personalised content can be shown to you based on a profile about you.
The performance and effectiveness of ads that you see or interact with can be measured.
The performance and effectiveness of content that you see or interact with can be measured.
Market research can be used to learn more about the audiences who visit sites/apps and view ads.
Your data can be used to improve existing systems and software, and to develop new products.
Content can be selected based on limited data, such as the content you are viewing or the device you are using.
Below is a list of all technology vendors that may process your data. You can enable or disable each vendor individually.