Avatar billede storm-bb Nybegynder
01. april 2005 - 17:32 Der er 29 kommentarer og
1 løsning

Flere Servere på samme maskine

Jeg hoster flere counterstrike servere på samme maskine. Hvordan kan jeg identifisere hver enkelt server. Hvis jeg fx kun vil stoppe server 1 og ikke de andre? CS serveren skal kunne stoppes gennem et script. Er det muligt at give en process et specifikt navn?
Avatar billede bufferzone Praktikant
01. april 2005 - 17:43 #1
Med f.eks. VMWare kan du have lige så mange virtuelle servere på din maskine som du lyster. Hver enkel server virker som en reel maskine med eget IP og andet
Avatar billede storm-bb Nybegynder
01. april 2005 - 18:00 #2
Kan jeg ikke gøre det på den aktuelle installation med fx screen?
Avatar billede bufferzone Praktikant
01. april 2005 - 18:17 #3
Hvis du kan identificere de enkelte serveres process ID, kan du stoppe dem med kommandoen Kill. Dette kan du gøre via et perl script
Avatar billede storm-bb Nybegynder
01. april 2005 - 18:27 #4
scriptet skal selv kunne identificerer serveren fra de andre. kan jeg ikke give processen eller noget et specielt navn som fx 1,2,3 osv.`?
Avatar billede kasper.h Nybegynder
01. april 2005 - 19:39 #5
der er en parameter til hlds, jeg mener den hedder -pidfile, hvor du angiver en fil hvor serveren skal lægge PID. Så kan du dræbe den ud fra det.
Avatar billede storm-bb Nybegynder
01. april 2005 - 19:40 #6
har du et eksempel på dette metode?
Avatar billede kasper.h Nybegynder
01. april 2005 - 20:10 #7
En hurtig søgning på google gav dette eksempel:
./hlds_i686 -game esf +maxplayers 10 -autoupdate -debug +map esf_city -pidfile hlds.9135.pid

Så står PID'en i den fil der kommer til at hedde hlds.9135.pid
Avatar billede kasper.h Nybegynder
01. april 2005 - 20:15 #8
så kan du dræbe den med
kill `cat hlds.9135.pid`
Avatar billede storm-bb Nybegynder
02. april 2005 - 00:55 #9
det virker ikke
Avatar billede storm-bb Nybegynder
02. april 2005 - 02:17 #10
Det virker med jeg får det forkert pid, jeg får til hlds_i686 men jeg skal bruge til hlds_run
Avatar billede kasper.h Nybegynder
02. april 2005 - 09:49 #11
Ja hlds_run er et script der starter hlds_i686. Hvis du gerne selv vil have kontrol over serveren og kunne dræbe den når du her lyst, er det nok smartere at køre hlds_i686 (ellerl hvilken cpu du nu har).
Avatar billede storm-bb Nybegynder
02. april 2005 - 14:49 #12
jeg kan ikke starte direkte fra hlds_i686 af en eller anden mystisk grund
Avatar billede kasper.h Nybegynder
02. april 2005 - 15:00 #13
ok, så kan du redigere hlds_run scriptet, så -pidfile kommer med, og kopiere hlds_run til de servere du skal køre, hvis du kører dem fra samme dir, ellers bare redigere dem alle.
Avatar billede storm-bb Nybegynder
02. april 2005 - 15:02 #14
hvordan gør jeg det?
Avatar billede kasper.h Nybegynder
02. april 2005 - 15:04 #15
du åbner filen i en teksteditor, og sætter -pidfile 1234 ind der hvor der står hlds_i686 (hvis det er den du bruger).
Avatar billede storm-bb Nybegynder
02. april 2005 - 15:55 #16
ok er blankt det står jo 5 steder og det tildeler vel også bare pidfile til hlds_i686 og ikke hlds_run
Avatar billede storm-bb Nybegynder
02. april 2005 - 15:55 #17
?
Avatar billede kasper.h Nybegynder
02. april 2005 - 16:16 #18
så må du paste filen her.
Avatar billede storm-bb Nybegynder
02. april 2005 - 16:26 #19
#!/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|hlds_amd64]"
    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`";
                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"; then
                    echo "Using AMD-Opteron (64 bit) Optimised binary."
                    HL=./hlds_amd64
                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
Avatar billede kasper.h Nybegynder
02. april 2005 - 16:29 #20
Ok, det ser jo nemt nok ud.

Ret følgende linier:

PID_FILE="pidfile.pid" # only needed it DEBUG is set so init later
PID_FILE_SET=1
Avatar billede kasper.h Nybegynder
02. april 2005 - 16:31 #21
det er muligt du lige skal lave filen, det kan du gøre med
touch pidfile.pid

(eller hvad du nu vælger at kalde filen)
Avatar billede storm-bb Nybegynder
02. april 2005 - 16:56 #22
på den måde får jeg stadig kun Pid på hlds_i686
Avatar billede storm-bb Nybegynder
02. april 2005 - 17:00 #23
jeg har fået det til at virke hvis jeg dræber alle hlds_run inden jeg slukker den specifik server genstarter den ikke
Avatar billede kasper.h Nybegynder
02. april 2005 - 17:01 #24
ja, det gør du..

hvis du vil have pid på hlds_run, kan du kalde de scripts du starter hl med noget forskelligt, f.eks hlds_run1 og hlds_run2, og så finde pid'en med
pidof hlds_run1
pidof hlds_run2
Avatar billede storm-bb Nybegynder
02. april 2005 - 17:09 #25
men det andet er vel ligeså godt? Når først serveren er startet er den vel ikke afhængig af hlds_run længere?
Avatar billede kasper.h Nybegynder
02. april 2005 - 17:10 #26
HL bliver ikke genstartet ved at du genstarter hlds_run, hlds_run er bare et script der kører hlds_i686. Så hvis du dræber hlds_run, kører hlds_i686 videre. Derfor skal du dræbe dem begge, hvis serveren skal lukkes nu eller genstartes.
Avatar billede kasper.h Nybegynder
02. april 2005 - 17:11 #27
hlds_run benyttes til at starte serveren igen hvis den dør.
Avatar billede kasper.h Nybegynder
02. april 2005 - 17:13 #28
nu ved jeg jo ikke præcist hvad det er du vil, men ja, du kan dræbe hlds_run, og så gå ind i spillet og bede serveren lukke ned.
Avatar billede storm-bb Nybegynder
02. april 2005 - 18:54 #29
du kan bare poste som svar hvis du vil have point. Tak for hjælpen.
Avatar billede kasper.h Nybegynder
02. april 2005 - 21:25 #30
Takker, og selv tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester