.sh / bash -Script

Dieses Thema im Forum "Technischer Support" wurde erstellt von AnonymusChaotic, 21. Oktober 2014.

  1. AnonymusChaotic
    Offline

    AnonymusChaotic

    Registriert seit:
    22. November 2013
    Beiträge:
    762
    Ort:
    Wien, Österreich
    Minecraft:
    AnonymusChaotic
    Hallo,
    momentan habe ich (noch) kein Webpanel für meine Server und mache alles über SSH.

    Da ich nur sehr geringe Kenntnisse über bash-scripte habe, wollte ich nun fragen ob mir jemand dabei helfen kann.


    Das aktuelle Script:
    Code (Text):
    1.  
    2. #!/bin/bash
    3.  
    4. screen -dmS BungeeCord  java -Xms256M -Xmx256M -Xincgc -jar /home/minecraft/servers/bungeecord/BungeeCord.jar nogui
    5. echo 'Archievement Get - BungeeCord started!'
    6. screen -dmS mainserver  java -Xms256M -Xmx2048M -Xincgc -jar /home/minecraft/servers/mainserver/minecraft_server.jar nogui
    7. echo 'Archievement Get - Mainserver started!'
    8. screen -dmS funwserver  java -Xms256M -Xmx2048M -Xincgc -jar /home/minecraft/servers/funwserver/minecraft_server.jar nogui
    9. echo 'Archievement Get - Funwserver started!'
    10. screen -dmS wienserver  java -Xms256M -Xmx2048M -Xincgc -jar /home/minecraft/servers/wienserver/minecraft_server.jar nogui
    11. echo 'Archievement Get - Wienserver started!'
    12.  
    13. echo 'DONE!'
    14.  
    Problem: Server werden zwar gestartet, aber alle im selben Verzeichnis... Sprich: Dateien im eigentlichen Verzeichnis werden nicht gelesen, dafür alle im /home/minecraft neu erstellt. Im endeffekt kann nur ein Server starten, die anderen blockiert weil der eine Port ja schon besetzt ist, der generiert dann aber alle benötigten sachen neu.
    Das sollte behoben werden...

    Aufgabe NR 1:
    zwischen
    screen -dmS BungeeCord java -Xms256M -Xmx256M -Xincgc -jar /home/minecraft/servers/bungeecord/BungeeCord.jar nogui
    und
    echo 'Archievement Get - BungeeCord started!'
    Eine Wartezeit, also eine Zeit, in der das Script aufhört weiterzulaufen von 40 Sekunden einbauen - So lange braucht der BungeeCord durchschnittlich, um sich zu starten.

    zwischen den restlichen Servern und deren Erfolgsmeldungen sollte eine Wartezeit von etwa 30 Sekunden liegen, von der letzten Erfolgsmeldung bis zu echo 'DONE!' weitere 20 Sekunden.

    Aufgabe NR.2:

    In einem eigenen Script sollen alle Screens der reihe nach geöffnet, dann je nachdem ob Bungeecord oder Normal-Server diese mit end oder stop geschlossen werden. Ich hätte das so gelöst:

    Code (Text):
    1.  
    2. #!/bin/bash
    3.  
    4. screen -r BungeeCord
    5. end
    6. echo 'Archievement Get - BungeeCord stopped!'
    7. screen -r mainserver
    8. echo 'Archievement Get - Mainserver stopped!'
    9. screen -r funwserver
    10. echo 'Archievement Get - Funwserver stopped!'
    11. screen -r wienserver
    12. echo 'Archievement Get - Wienserver stopped!'
    13.  
    14. echo 'DONE!'
    15.  
    aber ich vermute, dass das nicht funktionieren wird...

    Bitte um Hilfe,
    lg. AnonymusChaotic
     
    #1
  2. [Dev] iTzSasukeHDxLP
    Online

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    #2
  3. Legendary
    Offline

    Legendary

    Registriert seit:
    13. August 2012
    Beiträge:
    139
    Minecraft:
    HansWurst0815
    So zu 1:
    Diese Wartezeit ist ja nur für die Optik und hat keine ästhetische Funktion. Man könnte sie demnach also auch weglassen, da sie im wirklichen Sinne keine Zweck erfüllt. Wenn du wirklich das haben willst - ohne sinnvolle Funktion -, dann kannst du einfach sleep 40 vor dem echo einfügen.
    Das ist aber nicht der Sinn der Sache.
    Du möchtest ja nachgucken, ob der screen mit dem Namen "BungeeCord" (oder meinetwegen auch "Mainserver" oder "Funwserver" usw. läuft). Du könntest eine Abfrage nach x-Sekunden (meinetwegen 40 Sekunden) an screen -ls machen, ob der Screen mit grep -c "$name" (Name ist z.B. BungeeCord oder Mainserver) bereits gestartet ist oder nicht. Hierzu benutzt du eine if-Anweisung. Wenn if gleich nicht gestartet, dann (=then) startest du den in einem bestimmten Verzeichnis und machst meinetwegen einen Eintrag ins Log bzw. gibst irgendwie aus, dass der Server gerade gestartet wird. Die else-Anweisung würde lauten, dass der Screen bereits gestartet ist und nicht mehr gestartet werden muss; dies kann ebenso ausgegeben werden.

    Das ist noch eine einfache Möglichkeit und ich könnte dir beim Schreiben des Scriptes, was wirklich sehr leicht ist, helfen.
    Alternativ kann man noch eine Abfrage per Prozess ID (PID) machen, aber ich habe gerade nicht getestet, ob das überhaupt klappt^^ Ist aber weitaus komplexer.

    Nr. 2:
    Ich habe es nicht ausprobiert, aber es dürfte mit sehr hoher Wahrscheinlichkeit nicht funktionieren.
    Screen ist sehr vereinfacht gesagt ein Programm, mit dem man eine weitere Shell simuliert. Es müsste demnach eine Übergabe eines Befehls (in deinem Fall end oder stop) geben und ich weiß nicht, ob dies möglich ist. Diese Übergabe muss in Form eines Parameters beim Aufruf oder in Form eines Befehls vorliegen, aber da müsste ich mal googlen, ob es sowas überhaupt gibt.

    In Bezug auf den Port (ich bin mir nicht sicher, ob ich das richtig verstanden habe):
    Du kannst doch auch einfach den Port als Parameter in den Startbefehl des Minecraftservers einbinden, mittels --port ? Dann sollte das Problem doch eigentlich gelöst sein.
     
    #3
    AnonymusChaotic gefällt das.
  4. Legendary
    Offline

    Legendary

    Registriert seit:
    13. August 2012
    Beiträge:
    139
    Minecraft:
    HansWurst0815
    Gut, nach kurzem googlen habe ich Folgendes gefunden:
    screen -S BungeeCord -X stuff $'end\n'

    Du kannst ja mal ausprobieren, ob es klappt ;)
     
    #4
  5. AnonymusChaotic
    Offline

    AnonymusChaotic

    Registriert seit:
    22. November 2013
    Beiträge:
    762
    Ort:
    Wien, Österreich
    Minecraft:
    AnonymusChaotic
    Danke für den Hinweis :) Der Server selbst läuft ja schon mehr oder weniger Problemlos, mir persönlich geht es nur darum, die Server schneller starten und stoppen zu können. Ports sind daher geändert :)
    _______________________________________________________________________________
    Die Wartezeit hätte ich verwendet, da der Bungeecord 30 Sekunden Wartezeit hat, bevor er startet. So kann man einstellen, dass die Unterserver erst nach Start des Bugeecord starten. Ob das gut oder schlecht ist weiß ich ehrlich gesagt nicht. Ich probiere es einfach mal :)
    _______________________________________________________________________________

    Normalerweise kann ich einen Screen soundso öffnen mittels dem gegebenen Namen, also beispielsweise screen -r bungeecord. Um die PID, die sich ja bei jedem start ändert brauche ich mich nicht zu kümmern.
    _______________________________________________________________________________

    Das mit der Übergabe des Befehls ist eine sehr gute Idee, werde ich mal versuchen.

    Warum grep? Damit durchsucht man ja normalerweise Dateien? Könnte man nicht eher mit
    Code (Text):
    1.  
    2. user@Servername:/$ ls /run/screen/S-Username
    3. PID(z.B.54545oder2187).NamedesScreens1  PID.NamedesScreens2  PID.NamedesScreens3 PID.NamedesScreens4
    4.  
    oder
    Code (Text):
    1.  
    2. user@Servername:/$ screen -ls
    3.  
    4. There are screens on:
    5.         PID.NamedesScreens2 (10/30/14 07:56:32)     (Detached)
    6.         PID.NamedesScreens2 (10/30/14 07:56:32)     (Detached)
    7.         PID.NamedesScreens2 (10/30/14 07:56:32)     (Detached)
    8.         PID.NamedesScreens2 (10/30/14 07:56:32)     (Detached)
    9. 4 Sockets in /var/run/screen/S-username.
    10.  
    11.  
    das auslesen?

    Oder einfach den end-command in den screen mittels screen -S screenname -X stuff $'command\n' einfügen? Ist der Screen nicht vorhanden, wirft es mir dann eben die Fehlermeldung " No screen session found." aus.

    Was denkt Ihr ist am Besten?
     
    #5
  6. Legendary
    Offline

    Legendary

    Registriert seit:
    13. August 2012
    Beiträge:
    139
    Minecraft:
    HansWurst0815
    Gut, das ist natürlich nachvollziehbar. Dennoch ist eine Abfrage, ob der Server nun läuft oder nicht, eine ganz nette Funktion ;)

    Logisch. Um die PID brauchst du dich nicht zu kümmern, da es wie gesagt ein komplizierter Lösungsansatz ist (ich wollte es nur erwähnt haben).

    Wie gesagt, das meinte ich:
    Zitat Wikipedia:
    grep [gɹɛp] ist ein Programm, das unter den BetriebssystemenUnix und Unix-Derivaten der Suche und Filterung definierter Zeichenketten aus Dateien dient.

    Sprich, du kannst damit ziemlich viel suchen; unter anderem auch nach einem Namen eines Screens. Ist dieser Name vorhanden, kannst du eine Rückgabe oder Ausgabe an ein Log machen, dass der Server läuft - findet grep diesen Namen/ dieses Suchwort nicht, ist der Screen nicht vorhanden; sprich der Server ist noch nicht gestartet.

    Mit grep könntest du demnach nach der Zeichenkette PID.NamedesScreens2 (wobei die anderen umbenannt werden müssten) suchen und darauf dann schließen, ob der Server nun als Screen erreichbar ist oder nicht.
     
    #6