Dayz Epoch Unix Server , downen/restarten

  • Morgen zusammen , ich ahbe jetzt schon seit einigen tagen einen Dayz Epoch server auf Debian laufen .
    Jetzt wollte ich mal fragen wie man den Server am Freundlichsten quitirt/Restarted .
    zZ habe ich den Server in einen Screen über ein .sh script laufen was nur einen neustart macht wen er abstürtzt(noch nie vorgekommen)


    Bash
    #!/bin/bash
    while true
    do
    cd "$(dirname $0)"
    export LD_LIBRARY_PATH=.:/usr/lib32:$LD_LIBRARY_PATH;./epoch -server -mod="@dayz_epoch;@dayz_epoch_server;" -config="cfgdayz/server.cfg" -cfg="cfgdayz/basic.cfg" -port=2300 -beta="expansion/beta;expansion/beta/expansion" -noSound -noPause -world=Chernarus -profiles=cfgdayz -name=cfgdayz -cpucount=2 -exThreads=3 -showscripterrors -pid=2300.pid 2>&1 | ./writer.pl
    sleep 5
    done


    um ihr jetzt aber zu quitieren muss ich zu harten methoden greifen (strg+c) und ich habe dadurch teilweise datenbank- und gearfehler.


    edit by smurfi: spoiler entfernt

    Einmal editiert, zuletzt von smurfi ()

  • PHP
    <?phpfunction strToHex($string){    $hex='';    for ($i=0; $i < strlen($string); $i++)    {        $hex .= dechex(ord($string[$i]));    }    return $hex;}function hexToStr($hex){    $string='';    for ($i=0; $i < strlen($hex)-1; $i+=2)    {        $string .= chr(hexdec($hex[$i].$hex[$i+1]));    }    return $string;}function computeUnsignedCRC32($str){   sscanf(crc32($str), "%u", $var);   $var = dechex($var + 0);   return $var;}function dec_to_hex($dec){    $sign = ""; // suppress errors    $h = null;    if( $dec < 0){ $sign = "-"; $dec = abs($dec); }    $hex = Array( 0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5,                  6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 'a',                  11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e',...                  15 => 'f' );    do{        $h = $hex[($dec%16)] . $h;        $dec /= 16;    }    while( $dec >= 1 );    return $sign . $h;}function get_checksum($cs){  $var = computeUnsignedCRC32($cs); //echo "crchex: ".$var."<br/>";  $x = ('0x');  $a = substr($var, 0, 2);  $a = $x.$a;  $b = substr($var, 2, 2);  $b = $x.$b;  $c = substr($var, 4, 2);  $c = $x.$c;  $d = substr($var, 6, 2);  $d = $x.$d;  return chr($d).chr($c).chr($b).chr($a);}.function rcon($serverip, $serverport,$rconpassword,$cmd){  $passhead = chr(0xFF).chr(0x00);  $head = chr(0x42).chr(0x45);  $pass = $passhead.$rconpassword;  $answer = "";  $checksum = get_checksum($pass);  $loginmsg = $head.$checksum.$pass;  $rcon = fsockopen("udp://".$serverip, $serverport, $errno, $errstr, 1);  stream_set_timeout($rcon, 1);  if (!$rcon) {    echo "ERROR: $errno - $errstr<br />\n";  } else {    fwrite($rcon, $loginmsg);    $res = fread($rcon, 16);    $cmdhead = chr(0xFF).chr(0x01).chr(0x00);    //$cmd = "Players";    $cmd = $cmdhead.$cmd;    $checksum = get_checksum($cmd);    $cmdmsg = $head.$checksum.$cmd;    $hlen = strlen($head.$checksum.chr(0xFF).chr(0x01));    fwrite($rcon, $cmdmsg);    $answer = fread($rcon, 102400);    if ( strToHex(substr($answer, 9, 1)) == "0"){      $count = strToHex(substr($answer, 10, 1));      //echo $count."<br/>";      for ($i = 0; $i < $count-1; $i++){        $answer .= fread($rcon, 102400);      }    }    //echo strToHex(substr($answer, 0, 16))."<br/>";    //echo strToHex($answer)."<br/>";    //echo $answer."<br/>";    $cmd = "Exit";    $cmd = $cmdhead.$cmd;    $checksum = get_checksum($cmd);    $cmdmsg = $head.$checksum.$cmd;    fwrite($rcon, $cmdmsg);  }  return($answer);}?>


    theoretischer ablauf

    Bash
    #!/bin/bash
    RUNTIME=3600 # 1h serverlaufzeit
    SHUTDOWNTIME=5 # 5sekunden zeit für rcon shutdown
    
    
    /pfad/zum/serverstart & # im hintergrund laufen lassen
    sleep $RUNTIME
    php -f rcon.php # shutdown per rcon
    sleep $SHUTDOWNTIME
    kill -9 `ps ax|grep serverstart|grep -v grep|cut -f 1 -d" "`# serverstart muss noch durch den entsprechenden prozessnamen geändert werden

    Einmal editiert, zuletzt von smurfi ()

  • ok danke , das einzigste problem was ich jetzt ahbe ist wie übergebe ich die serverip serverport und rconpasswort , ich habe es über $argv und $argc $var probiert aber ich bekomme es einfach nciht übergeben.

  • Code
    $serverip='';
    $serverport='';
    $rconpassword='';
    $cmd='';
    rcon($serverip, $serverport,$rconpassword,$cmd);
    ?>


    ersetze die letzte zeile "?>" aus dem codeschnipsel mit diesem code und befülle die variablen ;)
    war eigentlich als hausaufgabe gedacht ^^

    Einmal editiert, zuletzt von smurfi ()

  • die variante hatte ich auch schon probiert aber ohne die funktion rcon() ::)


    aber es klappt immernoch nicht wie es soll. habe jetzt


    Zitat

    $serverip='***.***.***.***';
    $serverport='2300';
    $rconpassword='*****';
    $cmd='#shutdown'; und $cmd='shutdown';
    rcon($serverip,$serverport,$rconpassword,$cmd);


    muss ich bei den port die : mit reinschreiben?
    ansonsten wüsste ich jetzt nichtmehr weiter auser das der $cmd falsch ist ,


    ich schau mir mal die ganze webfront von dem rcon.php an , vllt finde ich den fehler

  • das einzige was mir noch im hinterstübchen rumgeistert, ist der gedanke gelesen zu haben das shutdown nicht mehr per remote ausgeführt werden kann... bin mir da aber nicht sicher...

  • habe jetzt die möglichkeit über cronjob zu restarten genommen (alle 4 h):

    Code
    0 0,4,8,12,16,20 * * * cd / && /$pathTo/restarter.pl


    innerhalb der restarter muss man aber den genauen $pathTo angeben.


    use constant PATH => '/$pathTo/'; # Set your epoch server dir

  • Eventuell hab ich es einfach überlesen, aber was spricht denn gegen BEC?


    Edit: Jetzt hab ich es gelesen, über Wine lässt sich BEC nicht ausführen?


  • Eventuell hab ich es einfach überlesen, aber was spricht denn gegen BEC?


    Edit: Jetzt hab ich es gelesen, über Wine lässt sich BEC nicht ausführen?


    gegen BEC spricht so gesehen nichts, auser das es eine exe ist, und ich nicht mit wine oder vm arbeiten will es so gesehen nicht ausführbar ist ;)