Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Ovládání herních serverů přez Web rozhraní  (Přečteno 2692 krát)

hama4tux

  • Návštěvník
  • Příspěvků: 94
Ovládání herních serverů přez Web rozhraní
« kdy: 16 Října 2008, 11:45:58 »
Dobrý den,
udělal jsem si ovladani hernich serveru prez web. je to vlastně apliakce hlds_run ktera se spustí.
Spouštění serverů probíhá v pořádku

Ale vypinani té aplikace je problematické, hlds_run je nejaky bash se spoustou parametrů a je v něm nastavený auto restart serveru pri spadnuti, cili ho nemuzu zabit killem. pak je v hlds_run moznost nastavit nejaky PID_file a jestli jsem to dobře pochopil tak by si to z toho pid filu melo brat PID CISLO, to by se mi pomerne hodilo nastavit abych to mohl prez kill zabijet.

Prvni me reseni vypinani bylo exec('screen -d -r hlds1 && quit') quit je prikaz na vypnuti te aplikace, bohuzel to vyhodi hlasku ze musim byt pripojeny k terminalu.

tak je podle me uz asi jedine reseni vnutit tomu PID a zabijet to killem s vypnutym autorestaretem serveru
Poradte:)

hlds run toto je pouhá část toho hlds_run ale asi nejdulezitesi pro moje uceli
Citace
#!/bin/sh
#
#       Copyright (c) 2002, Valve LLC. All rights reserved.
#
#       a wrapper script for the main hl 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=".:$LD_LIBRARY_PATH"

init() {
        # Initialises the various variables
        # Set up the defaults
        GAME="valve"
        DEBUG=""
        RESTART="no"
        HL=./hlds_i486
        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=1
        STEAMERR=""
        SIGINT_ACTION="quit 0" # exit normally on sig int
        NO_TRAP=0
        AUTO_UPDATE=""
        STEAM_USER=""
        STEAM_PASSWORD=""
        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


Petr Merlin Vaněček

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 5057
    • Lomítkáři
Re: Ovládání herních serverů přez Web rozhraní
« Odpověď #1 kdy: 16 Října 2008, 16:21:20 »
Tuším, že někde bude nekonečná smyčka, která teprve spouští vlastní proces serveru, je potřeba najít PID té smyčky, zabít ji a pak teprve sestřelit vlastní server.
Stiskni CTRL + W ...
80% mozku tvoří kapalina ... u některých brzdová

hama4tux

  • Návštěvník
  • Příspěvků: 94
Re: Ovládání herních serverů přez Web rozhraní
« Odpověď #2 kdy: 16 Října 2008, 16:44:48 »
pro upresnenni sem davam celi hlds_run, koukni se prosim na spodni cast kde je quit () a parametry a zkus mi rict jestli to tam nejak muzu dostat kdyz nejsem na serveru a ten bezi ve screenu

Citace
#!/bin/sh
#
#       Copyright (c) 2002, Valve LLC. All rights reserved.
#
#   a wrapper script for the main hl 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=".:$LD_LIBRARY_PATH"

init() {
   # Initialises the various variables
   # Set up the defaults
   GAME="valve"
   DEBUG=""
   RESTART="yes"
   HL=./hlds_i486
   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=""
   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
      "-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 ;;
      "-autoupdate")
         AUTO_UPDATE="yes"
         STEAM="./steam"
         RESTART="yes" ;;
      "-steamerr")
         STEAMERR=1 ;;
      "-ignoresigint")
         SIGINT_ACTION="" ;;
      "-notrap")
         NO_TRAP=1 ;;
      "-steamuser")
         STEAM_USER="$2";
         shift ;;
      "-steampass")
         STEAM_PASSWORD="$2";
         shift ;;
      "-help")
         # quit with syntax
         quit 2
         ;;
      esac
      shift
   done

   # Ensure we have a game specified
   if test -z "$GAME"; then
      echo "Unable to determine game type from command line."
      quit 1
   elif test ! -d "$GAME"; then
      echo "Invalid game type '$GAME' sepecified."
      quit 1
   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 "Half-life 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 "Half-life 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 "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 "You must set both the steam username and password."
      quit 1
   fi

   if test 1 -eq $PID_FILE_SET && test -n "$PID_FILE"; then
      HL_CMD="$HL $PARAMS -pidfile $PID_FILE"
   else
      HL_CMD="$HL $PARAMS"
   fi
}

syntax () {
   # Prints script syntax

   echo "Syntax:"
   echo "$0 [-game <game>] [-debug] [-norestart] [-pidfile]"
   echo "   [-binary [hlds_i486|hlds_i686|hlds_amd]"
   echo "   [-timeout <number>] [-gdb <gdb>] [-autoupdate]"
   echo "   [-steamerr] [-ignoresigint] [-steamuser <username>]"
   echo "   [-steampass <password>] [-debuglog <logname>]"
   echo "Params:"
   echo "-game <game>           Specifies the <game> to run."
   echo "-debug                 Run debugging on failed servers if possible."
   echo "-debuglog <logname>   Log debug 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 )."
   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 "-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 "-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 sharedlibrary" >> 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 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 -e /proc/cpuinfo; then
      CPU_VERSION="`grep "cpu family" /proc/cpuinfo | cut -f2 -d":" | tr -d " " | uniq`";
      if test $CPU_VERSION -lt 4; then
         echo "Error: hlds_l REQUIRES a 486 CPU or better";
         quit 1
   #   elif  test $CPU_VERSION -eq 15; then
   #      # P4 CPU version
   #      echo "Using Pentium II Optimised binary."
   #      HL=./hlds_i686
   #
      elif test $CPU_VERSION -ge 6; then
         AMD="`grep AMD /proc/cpuinfo`";
         if test -n "$AMD"; then
            OPTERON="`grep Opteron /proc/cpuinfo`";
            PLATFORM="`uname -m`"
            if test -z "$OPTERON"; then
               OPTERON="`grep "Athlon HX" /proc/cpuinfo`";
               if test -z "$OPTERON"; then
                  OPTERON="`grep "Athlon(tm) 64" /proc/cpuinfo`";
               fi
            fi

            if test -n "$OPTERON" && test "x86_64" = "$PLATFORM"; then
               echo "Using AMD-Opteron (64 bit) Optimised binary."
               HL=./hlds_amd
            else
               echo "Using AMD Optimised binary."
               HL=./hlds_amd
            fi
         else
            echo "Using Pentium II Optimised binary."

            # there is a CPU manufactured by VIA that
            # doesn't support some PII instructions...
            # detect this.
            VIACHIP=`grep CentaurHauls /proc/cpuinfo`
         
            if test -z "$VIACHIP"; then
               HL=./hlds_i686
            fi
         fi      
      else
         echo "Using default binary."
      fi

   elif test "FreeBSD" = `uname`; then
      CPU="`grep 'CPU:' /var/run/dmesg.boot`"
      AMD="`echo $CPU |grep AMD`"
      I686="`echo $CPU |grep 686`"
      if test -n "$AMD"; then
         echo "Using AMD Optimised binary."
         HL=./hlds_amd
      elif test -n "$I686" ; then
         echo "Using Pentium II Optimised binary."
         HL=./hlds_i686
      else
         echo "Using default binary."
      fi
   else
      echo "Using default binary."
   fi
}

update() {
   updatesingle
}

updatesingle() {
   # Run the steam update
   # exits on failure if STEAMERR is set

   if test -n "$AUTO_UPDATE"; then
      if test -f "$STEAM"; then
         echo "Updating server using Steam."
         CMD="$STEAM -command update -game $GAME -dir .";
         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
         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 "Could not locate steam binary:$STEAM, exiting.";
            quit 1
         else
            echo "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 "Auto-restarting the server on 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

Petr Merlin Vaněček

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 5057
    • Lomítkáři
Re: Ovládání herních serverů přez Web rozhraní
« Odpověď #3 kdy: 16 Října 2008, 16:51:47 »
Tady je ta smyčka
Kód: [Vybrat]
  #loop forever
      while true
      do

A tady se to zabíjí:
Kód: [Vybrat]
   # 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 $$

Z toho už se to dá vydedukovat, co je potřeba udělat, ne? :)
Stiskni CTRL + W ...
80% mozku tvoří kapalina ... u některých brzdová

 

Provoz zaštiťuje spolek OpenAlt.