Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 25

Thema: Mehrere Server in einem Startscript zusammenfassen

  1. #1
    Registrierter Benutzer
    Registriert seit
    Dec 2014
    Beiträge
    14

    Question Mehrere Server in einem Startscript zusammenfassen

    Hallo zusammen,

    ich hoffe ich habe hier den richtigen Ort für mein Problem gefunden...

    Ich habe einen Rootserver, auf dem zur Zeit mehrere Gameserver laufen. [Minecraft Server welche über einen Bungeecordserver verbunden sind]
    Diese haben alle in ihrem Ordner eine start.sh welche ungefähr so aussieht:

    Code:
    screen -A -m -d -S SERVERNAME java -Xmx2048M -Xms2048M -jar spigot.jar
    Die stop.sh sieht so aus:

    Code:
    screen -S SERVERNAME -X quit
    Ich würde die Startscripte und auch die Stopscripte gerne so verbinden, dass man zum Starten und Stoppen des Servernetzwerks nur eine Datei ausführen muss...
    Perfekt wäre es natürlich wenn man die Server auch einzeln Starten/Stoppen könnte, aber eben nur ein "Programm" dafür hat. <- Keine Ahnung ob man sowas überhaupt umsetzen kann...
    Ich freue mich auf eure Antworten :)

    Mit freundlichen Grüßen
    Spongebob
    Geändert von Spongebob (29.12.14 um 16:38 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    öhm reicht nicht was in der Art?
    Start:
    Code:
    #!/bin/bash
    
    case "$1" in
    'start')
    		/pfad/zum/ersten/start/skript/start.sh
    		/pfad/zum/zweiten/start/skript/start.sh
    		#...
    		/pfad/zum/nten/start/skript/start.sh
    		;;
    
    'stop')
    		/pfad/zum/ersten/stop/skript/stop.sh
    		/pfad/zum/zweiten/stop/skript/stop.sh
    		#...
    		/pfad/zum/nten/stop/skript/stop.sh
    		;;
    
    'restart')
    		$0 stop
    		#5 sekunden pause
    		sleep 5
    		$0 start
    		;;
    
    *)
    		echo "usage: $0 { start | stop | restart }"
    		;;
    
    esac
    exit 0
    Skript habe ich mir von hier geklaut - http://www.der-taegliche-admin.de/20...ipt-erstellen/
    Jedenfalls kannst du die Server dann so starten/stopen:
    Code:
    # start
    /pfad/zum/neuen/skript/neuer_skript start
    # stop
    /pfad/zum/neuen/skript/neuer_skript stop
    # neu starten
    /pfad/zum/neuen/skript/neuer_skript restart
    Außerdem kannst du dieses Skript auch direkt ins Init-System einbauen, dann werden die Server direkt beim booten gestartet bzw. beim Herunterfahren beendet. Leider gibt es inzwischen ziemlich viele Init-System (http://de.wikipedia.org/wiki/Init), so dass keine generelle Anleitung mehr möglich ist...
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  3. #3
    Registrierter Benutzer
    Registriert seit
    Dec 2014
    Beiträge
    14
    Danke für die schnelle Antwort. Ich werde das gleich mal direkt ausprobieren und berichten

  4. #4
    Registrierter Benutzer
    Registriert seit
    Dec 2014
    Beiträge
    14
    Zitat Zitat von nopes Beitrag anzeigen
    öhm reicht nicht was in der Art?
    Start:
    Code:
    #!/bin/bash
    
    case "$1" in
    'start')
    		/pfad/zum/ersten/start/skript/start.sh
    		/pfad/zum/zweiten/start/skript/start.sh
    		#...
    		/pfad/zum/nten/start/skript/start.sh
    		;;
    
    'stop')
    		/pfad/zum/ersten/stop/skript/stop.sh
    		/pfad/zum/zweiten/stop/skript/stop.sh
    		#...
    		/pfad/zum/nten/stop/skript/stop.sh
    		;;
    
    'restart')
    		$0 stop
    		#5 sekunden pause
    		sleep 5
    		$0 start
    		;;
    
    *)
    		echo "usage: $0 { start | stop | restart }"
    		;;
    
    esac
    exit 0
    Skript habe ich mir von hier geklaut - http://www.der-taegliche-admin.de/20...ipt-erstellen/
    Jedenfalls kannst du die Server dann so starten/stopen:
    Code:
    # start
    /pfad/zum/neuen/skript/neuer_skript start
    # stop
    /pfad/zum/neuen/skript/neuer_skript stop
    # neu starten
    /pfad/zum/neuen/skript/neuer_skript restart
    Außerdem kannst du dieses Skript auch direkt ins Init-System einbauen, dann werden die Server direkt beim booten gestartet bzw. beim Herunterfahren beendet. Leider gibt es inzwischen ziemlich viele Init-System (http://de.wikipedia.org/wiki/Init), so dass keine generelle Anleitung mehr möglich ist...
    Hmmm, hab das gerade mal so gemacht:

    Code:
    #!/bin/bash
    
    case "$1" in
    'start')
                    /home/bungeecord/start.sh
                    /home/lobby/start.sh
                    ;;
    
    'stop')
                    /home/bungeecord/stop.sh
                    /home/lobby/stop.sh
                    ;;
    
    'restart')
                    $0 stop
                    sleep 30
                    $0 start
                    ;;
    
    *)
                    echo "usage: $0 { start | stop | restart }"
                    ;;
    
    esac
    exit 0
    Habe mir auch mit
    Code:
     chmod +x Steuerung.sh
    die Rechte gegeben, glaube ich... Trotzdem bekomme ich keinen Screen wenn ich
    Code:
     ./Steuerung.sh start
    eingebe. Ich bekomme garkeine Antwort von der Konsole...
    Geändert von Spongebob (29.12.14 um 17:30 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    hmm pack einfach mal ein paar debug echos rein, etwa so:
    Code:
    #!/bin/bash
    
    echo "\$1 ist '${1}'"
    case "$1" in
    'start')
                   echo "starte bungeecord" 
                    /home/bungeecord/start.sh
                   echo "starte lobby" 
                    /home/lobby/start.sh
                    ;;
    
    'stop')
                   echo "stope bungeecord" 
                    /home/bungeecord/stop.sh
                   echo "stope lobby" 
                    /home/lobby/stop.sh
                    ;;
    
    'restart')
                    $0 stop
                    sleep 30
                    $0 start
                    ;;
    
    *)
                    echo "usage: $0 { start | stop | restart }"
                    ;;
    
    esac
    echo "ende"
    exit 0
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  6. #6
    Registrierter Benutzer
    Registriert seit
    Dec 2014
    Beiträge
    14
    Zitat Zitat von nopes Beitrag anzeigen
    hmm pack einfach mal ein paar debug echos rein, etwa so:
    Code:
    #!/bin/bash
    
    echo "\$1 ist '${1}'"
    case "$1" in
    'start')
                   echo "starte bungeecord" 
                    /home/bungeecord/start.sh
                   echo "starte lobby" 
                    /home/lobby/start.sh
                    ;;
    
    'stop')
                   echo "stope bungeecord" 
                    /home/bungeecord/stop.sh
                   echo "stope lobby" 
                    /home/lobby/stop.sh
                    ;;
    
    'restart')
                    $0 stop
                    sleep 30
                    $0 start
                    ;;
    
    *)
                    echo "usage: $0 { start | stop | restart }"
                    ;;
    
    esac
    echo "ende"
    exit 0
    Wo soll denn die Datei dann am besten landen?

    Gruß Spongebob

  7. #7
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    üblicherweise in /etc/init.d
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  8. #8
    Registrierter Benutzer
    Registriert seit
    Dec 2014
    Beiträge
    14
    Leider funktioniert das auch nicht... Ich bekomme zwar
    Code:
    $1 ist 'start'
    starte bungeecord
    starte lobby
    ende
    von der Konsole, mehr passiert aber nicht. Die Server starten nicht und es wird folglich auch kein Screen gestartet.....

  9. #9
    Registrierter Benutzer
    Registriert seit
    Dec 2014
    Beiträge
    14

    Habe es geschafft!

    So, nach, gefühlt, jahrelangem herumprobieren habe ich eine halbwegs funktionale Lösung gefunden:

    Code:
    #!/bin/bash
    INSTANZ="Steuerung"
    BPDIR1=/home/bungeecord/
    BPDIR2=/home/lobby/
    Pidfile=/home/Steuerung.pid
    
    if [ -f $Pidfile ]
    then
    	Pid=`cat $Pidfile`
    fi
    
    case "$1" in
    'start')
    		if [ -f $Pidfile ] ; then
    				if test `ps -e | grep -c $Pid` = 1; then
    						echo "$INSTANZ wird nicht ausgeführt - Anwendung läuft bereits mit PID: $Pid"
    				else
    						echo "Starte Bungee $INSTANZ"
    						cd $BPDIR1
    						nohup ./start.sh &> /dev/null &
    						echo $! > $Pidfile
    						echo "Starte Lobby $INSTANZ"
    						cd $BPDIR2
    						nohup ./start.sh &> /dev/null &
    						echo $! > $Pidfile
    				fi
    		else
    				echo "Starte Bungee $INSTANZ"
    				cd $BPDIR1
    				nohup ./start.sh &> /dev/null &
    				echo $! > $Pidfile
    				echo "Starte Lobby $INSTANZ"
    				cd $BPDIR2
    				nohup ./start.sh &> /dev/null &
    				echo $! > $Pidfile
    		fi
    		;;
    
    'stop')
    		if [ -f $Pidfile ] ; then
    				echo "stopping $INSTANZ"
    				cd $BPDIR1
    				nohup ./stop.sh &> /dev/null &
    				echo $! > $Pidfile
    				echo "stopping $INSTANZ"
    				cd $BPDIR2
    				nohup ./stop.sh &> /dev/null &
    				echo $! > $Pidfile
    		else
    				echo "Kann $INSTANZ nicht stoppen - die Pidfile wurde nicht gefunden!"
    		fi
    		;;
    
    'restart')
    		$0 stop
    		sleep 30
    		$0 start
    		;;
    
    *)
    		echo "usage: $0 { start | stop | restart}"
    		;;
    
    esac
    exit 0
    Das Ganze befindet sich im /home-Verzeichnis und funktioniert mit den Befehlen ./Steuerung.sh start/stop/restart...

    Gibt es nicht einen leichteren Weg? Ich finde es relativ aufwendig einen neuen Server hinzuzufügen....

    Freue mich auf eure Antworten

    Grüße
    Spongebob

  10. #10
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    Ich sehe das so, du weißt nun "wie es geht" der Rest ergibt sich dann eh
    Ansonsten:
    Denk mal hier drüber nach:
    Code:
    #!/bin/bash
    basis_pfad="/home/nopes/meine_minecraft_server/"
    server_pfade=("${basis_pfad}foo" "${basis_pfad}bar" "${basis_pfad}etc")
    for server_pfad in ${server_pfade[@]}; do
      echo "\$server_pfad =${server_pfad}"
    done
    exit 0
    Und http://www.tldp.org/LDP/Bash-Beginne...tml/index.html ist immer einen bzw. mehrere Blicke wert!

    [edit]Nachtrag, falls du dich über ${var} wunderst - siehe hier; umständlicher aber sicherer
    Geändert von nopes (29.12.14 um 23:54 Uhr) Grund: böser typo
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  11. #11
    Registrierter Benutzer
    Registriert seit
    Dec 2014
    Beiträge
    14
    So langsam verstehe ich was das bedeutet... Bei den Serverpfaden soll ich wahrscheinlich jeden Server einzeln "verlinken". Nur dann später bei der Handlung, das versteh ich noch nicht. Wenn ich dieses Script jetzt ausführe, was genau passiert denn dann eigentlich ?

    Grüße
    Spongebob
    Geändert von Spongebob (29.12.14 um 23:48 Uhr)

  12. #12
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    so verständlicher?
    Code:
    #!/bin/bash
    basis_pfad="/home/nopes/meine_minecraft_server/"
    Pidfile="/var/run/meine_minecraft_Steuerung.pid" # pid gehören in /var/run verwahrt
    server_pfade=("${basis_pfad}foo" "${basis_pfad}bar" "${basis_pfad}etc")
    
    for server_pfad in ${server_pfade[@]}; do
      echo "starte instanz in '${server_pfad}'"
      cd "$server_pfad "
      nohup ./start.sh &> /dev/null &
      #echo $! > $Pidfile
      # ah und noch was, wenn ich da jetzt so drüber schau, hier hast du einen bug ein geskripptet
      # du hast ja mehrere server - die haben aber keine eigene pid-datei!!!
    done
    echo "bye"
    exit 0
    Idee ist, das for in den entsprechenden cases (start,stop) zu verwenden

    [edit]
    Aber wie im Kommentar des Skripts ersichtlich ist, so richtig gut ist der noch nicht. Du kannst halt nicht prüfen, ob der eine oder andere läuft, also sauberer:
    schreibe je Server einen Start/Stop Skript und implementiere dabei status
    schreibe anschließend einen weiteren Skript, der zur Verwaltung dient; falls das dann überhaupt noch notwendig ist - jedenfalls keep fighting

    [edit2]falls du eine Verwaltung willst, einfacher und dennoch dynamischer Ansatz ist:
    lege alle Start/Skripte in einem eigenen "Verzeichnis" ab, keine anderen Dateien sind in diesem Verzeichnis!
    "linke" die Skripte nach /etc/init.d - wie erwähnt "Init System", wegen Autostart und so
    im Verwakltungs Skript erzeugst du ein Feld aus den Dateinamen in dem "Verzeichnis"
    der Rest sollte klar sein
    Geändert von nopes (30.12.14 um 00:05 Uhr) Grund: richtig böser typo
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  13. #13
    Registrierter Benutzer
    Registriert seit
    Dec 2014
    Beiträge
    14
    Zitat Zitat von nopes Beitrag anzeigen
    so verständlicher?
    Code:
    #!/bin/bash
    basis_pfad="/home/nopes/meine_minecraft_server/"
    Pidfile="/var/run/meine_minecraft_Steuerung.pid" # pid gehören in /var/run verwahrt
    server_pfade=("${basis_pfad}foo" "${basis_pfad}bar" "${basis_pfad}etc")
    
    for server_pfad in ${server_pfade[@]}; do
      echo "starte instanz in '${server_pfad}'"
      cd "$server_pfad "
      nohup ./start.sh &> /dev/null &
      #echo $! > $Pidfile
      # ah und noch was, wenn ich da jetzt so drüber schau, hier hast du einen bug ein geskripptet
      # du hast ja mehrere server - die haben aber keine eigene pid-datei!!!
    done
    echo "bye"
    exit 0
    Idee ist, das for in den entsprechenden cases (start,stop) zu verwenden

    [edit]
    Aber wie im Kommentar des Skripts ersichtlich ist, so richtig gut ist der noch nicht. Du kannst halt nicht prüfen, ob der eine oder andere läuft, also sauberer:
    schreibe je Server einen Start/Stop Skript und implementiere dabei status
    schreibe anschließend einen weiteren Skript, der zur Verwaltung dient; falls das dann überhaupt noch notwendig ist - jedenfalls keep fighting

    [edit2]falls du eine Verwaltung willst, einfacher und dennoch dynamischer Ansatz ist:
    lege alle Start/Skripte in einem eigenen "Verzeichnis" ab, keine anderen Dateien sind in diesem Verzeichnis!
    "linke" die Skripte nach /etc/init.d - wie erwähnt "Init System", wegen Autostart und so
    im Verwakltungs Skript erzeugst du ein Feld aus den Dateinamen in dem "Verzeichnis"
    der Rest sollte klar sein
    Okay, vielen lieben Dank

    So ein Start/Stop/Status-Skript bekomme ich für jeden Server hin, glaube ich. Aber Naja, ich hatte mich bereits an einer verlinken versucht, allerdings gingen mir schnell die Ideen aus. Mein Problem ist, dass ich nicht weiß wie ich die Dateien dann "zusammenfügen" kann... Man braucht ja sowas wie ein "und" - Befehl, den habe ich nicht. Wäre wirklich super wenn dir auch dazu was einfällt
    Dann würde ich das später direkt mal auf dem Server testen
    Liebe grüße
    Spongebob

  14. #14
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    Code:
    mkdir /srv/meine_minecraft_server
    mkdir /srv/meine_minecraft_server/server_1
    mkdir /srv/meine_minecraft_server/server_2
    mkdir /srv/meine_minecraft_server/server_3
    # nun mache ich drei start/skripte im geiste
    nano /srv/meine_minecraft_server/server_1/management.sh
    chmod u+x /srv/meine_minecraft_server/server_1/management.sh
    nano /srv/meine_minecraft_server/server_2/management.sh
    chmod u+x /srv/meine_minecraft_server/server_2/management.sh
    nano /srv/meine_minecraft_server/server_3/management.sh
    chmod u+x /srv/meine_minecraft_server/server_3/management.sh
    # jetzt linke ich die
    ln -s /srv/meine_minecraft_server/server_1/management.sh /etc/init.d/mein_meincraft_server1
    ln -s /srv/meine_minecraft_server/server_2/management.sh /etc/init.d/mein_meincraft_server2
    ln -s /srv/meine_minecraft_server/server_3/management.sh /etc/init.d/mein_meincraft_server3
    # jetzt packe ich die in den init prozess (booten und so) - bei mir ist das init system sysv, also
    sysv-rc-conf
    Dann fehlt noch der Management-Skript, der dann aber beliebig komplex werden kann - jedenfalls ist "mein Startpunkt/Idee" eine "dynamische Schleife" über die Dateien in einem Verzeichnis:
    Code:
    # ganz grob
    #!/bin/bash
    cd /wohin/auch/immer
    for datei in *
    do
      echo "\$datei=${datei}"
      # dann halt komplexität einführen so in der art
      # wenn das Kommando: $datei status == "läuft", dann server als gut markieren
      # sonst ...
    done
    Kann dann von der Sache her beliebig komplex werden, siehe die bereits erwähnten Verweise - oder du machst einfach einen Skript pro Server
    Geändert von nopes (30.12.14 um 00:49 Uhr)
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  15. #15
    Registrierter Benutzer
    Registriert seit
    Dec 2014
    Beiträge
    14
    Zitat Zitat von nopes Beitrag anzeigen
    Code:
    mkdir /srv/meine_minecraft_server
    mkdir /srv/meine_minecraft_server/server_1
    mkdir /srv/meine_minecraft_server/server_2
    mkdir /srv/meine_minecraft_server/server_3
    # nun mache ich drei start/skripte im geiste
    nano /srv/meine_minecraft_server/server_1/management.sh
    chmod u+x /srv/meine_minecraft_server/server_1/management.sh
    nano /srv/meine_minecraft_server/server_2/management.sh
    chmod u+x /srv/meine_minecraft_server/server_2/management.sh
    nano /srv/meine_minecraft_server/server_3/management.sh
    chmod u+x /srv/meine_minecraft_server/server_3/management.sh
    # jetzt linke ich die
    ln -s /srv/meine_minecraft_server/server_1/management.sh /etc/init.d/mein_meincraft_server1
    ln -s /srv/meine_minecraft_server/server_2/management.sh /etc/init.d/mein_meincraft_server2
    ln -s /srv/meine_minecraft_server/server_3/management.sh /etc/init.d/mein_meincraft_server3
    # jetzt packe ich die in den init prozess (booten und so) - bei mir ist das init system sysv, also
    sysv-rc-conf
    Dann fehlt noch der Management-Skript, der dann aber beliebig komplex werden kann - jedenfalls ist "mein Startpunkt/Idee" eine "dynamische Schleife" über die Dateien in einem Verzeichnis:
    Code:
    # ganz grob
    #!/bin/bash
    cd /wohin/auch/immer
    for datei in *
    do
      echo "\$datei=${datei}"
      # dann halt komplexität einführen so in der art
      # wenn das Kommando: $datei status == "läuft", dann server als gut markieren
      # sonst ...
    done
    Kann dann von der Sache her beliebig komplex werden, siehe die bereits erwähnten Verweise - oder du machst einfach einen Skript pro Server
    Ich möchte mich dann gleich an die Skripte machen, habe aber noch ein paar Fragen dazu
    Kann man anstelle der Pidfiles nicht auch überprüfen ob der Screen mit dem Namen "BlaBa" läuft? Denn wenn der Server läuft, läuft auch der Screen. Wenn er aus ist, ist auch der Screen aus. Klingt für mich etwas sicherer als Überprüfung, oder? Wo die einzelnen Skripte liegen, ist doch eigentlich egal, oder? Wenn ich die in meinem Managementskript zusammenfüge, wird doch eh der Pfad angegeben...

    Da ich selbst nur ein bisschen JavaScript kann, und auch nur in dieser Programmiersprache "denken" kann, hatte ich für das Management Skript an sowas gedacht:
    Jetzt mal sehr stark vereinfacht, ich hoffe mein Plan wird trotzdem klar:

    ZÄHLER=1
    wenn ([Benutzereingabe "Start"])
    for ([ZÄHLER<SERVERANZAHL])
    wenn ([ScreenNrZÄHLER NICHT läuft])
    führe aus: "VariabelFürDenPfadWoAlleStart/StopskripteLiegen"ZÄHLER.sh
    ZÄHLER=ZÄHLER+1
    System.Outprintl.("Server Nr. ZÄHLER wurde GESTARTET")
    else
    ZÄHLER=ZÄHLER+1
    System.Outprintl.("Server Nr. ZÄHLER LÄUFT BEREITS")

    Jetzt müsste man das nur noch irgendwie in Bash übersetzen....
    Für Stop dann genauso, nur beim Status weiß ich nicht so recht wie ich den immer einzeln abfragen kann. Wäre ja cool wenn man eine schöne "Darstellung" für den Status der Server bekommt, weißt du da mehr?

    Liebe Grüße
    Spongebob

Ähnliche Themen

  1. mehrere apache logs zusammenfassen & sortieren
    Von D3R S3H@ im Forum Linux Allgemein
    Antworten: 5
    Letzter Beitrag: 09.12.10, 12:45
  2. mehrere server mit apache zusammenfassen
    Von hugin grímnirson im Forum Linux als Server
    Antworten: 6
    Letzter Beitrag: 10.06.06, 09:42
  3. iptables Firewall: mehrere ifaces zusammenfassen
    Von sammy im Forum System installieren und konfigurieren
    Antworten: 3
    Letzter Beitrag: 28.04.04, 19:33
  4. Mehrere CS-Server auf einem PC - wie?
    Von Zyklop3D im Forum Dedizierte Spiele Server
    Antworten: 8
    Letzter Beitrag: 17.08.03, 22:23
  5. Mehrere DSL Leitungen zusammenfassen
    Von TortureKing im Forum Anbindung an die Aussenwelt
    Antworten: 6
    Letzter Beitrag: 20.07.03, 20:52

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •