• Bitte beachte, dass wir eine Serverliste sind!
    Wenn du ein Problem auf einem Server hast (z.B. Entbannantrag, etc), dann ist das Forum hier der falsche Ort.
  • Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Restart Script / start.sh

peaceguy

Schafhirte
Mitglied seit
17 Oktober 2013
Beiträge
139
Hallo zusammen,

folgendes Problem: Der /restart Befehl funktioniert nicht. Das liegt schätzungsweise daran, dass der Server in einer screen Session läuft und deswegen mein Startscript nicht richtig aufgerufen werden kann. Meine start.sh enthält folgendes:
start.sh:
screen -AmdS minecraft java -Xms10240M -Xmx10240M -jar /home/minecraft/spigot-1.13.2.jar
Wahrscheinlich brauch ich jetzt noch ein zweites Script, aber das übersteigt leider meine Fähigkeiten. Kann mir da jemand aushelfen?


Liebe Grüße
 

LapisMC

Kuhfänger
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
58
Alter
20
Minecraft
LapisMC
Wie das mit dem Restart-Befehl abläuft, weiß ich nicht, eine einfache Lösung für automatische Restarts lässt sich aber durch das folgende Startskript umsetzen (ersetzt deine bereits vorhandene start.sh):
Startskript:
#!/bin/bash
rm STOP
until [ -f STOP ]; do
java -Xms10G -Xmx10G -jar /home/minecraft/spigot-1.13.2.jar
done
Dieses Skript kannst du dann in das Serververzeichnis packen und in einem Screen laufen lassen:
Startbefehl:
cd /home/minecraft/
screen -dmS minecraft sh start.sh
Wenn der Server dann gestoppt wird (ganz normal über /stop), startet er automatisch wieder neu, es sei denn, im Serververzeichnis befindet sich eine Datei namens STOP. Diese kannst du mit touch /home/minecraft/STOP erzeugen. Vorteilhaft ist auch, dass der Minecraft-Server auch im Falle eines Absturzes oder sonstigen unerwarteten Ausfalls sofort neustartet.

Edit:
Durch die Lösung oben bleibt die beim Start erstellte Screen-Session offen und der neugestartete Server läuft ebenfalls darin. Es handelt sich nicht um ein Restart-Script, dass du in die spigot.yml eintragen kannst, sondern bietet unabhängig davon ein ähnliches Ergebnis.

Falls du lieber mit der /restart-Funktion arbeiten willst, reicht dein Startskript eigentlich schon aus. Es wäre allerdings sinnvoller, eine Kopie davon im Serververzeichnis abzulegen. Das Skript erstellt einen neuen Screen, da der Alte durch das Herunterfahren des Servers ebenfalls beendet wird.
 
Zuletzt bearbeitet:

❤️可愛いちゃん️❤️

Enderdragonjäger
Osterei Experte
Mitglied seit
19 Mai 2014
Beiträge
1.094
Alter
2
Vorteilhaft ist auch, dass der Minecraft-Server auch im Falle eines Absturzes oder sonstigen unerwarteten Ausfalls sofort neustartet.
Ich würde das als großen Nachteil sehen, aber jeder wie er meint.

Du musst einfach ein "restart-script" in der spigot.yml definieren, wird auch im Wiki erklärt (https://www.spigotmc.org/wiki/spigot-configuration/). Ich weiß leider nicht wie screen damit umgeht, wenn sein Prozess beendet wird. Entweder muss in diesem Skript auch die screen Session gestartet werden oder nicht. Das müsstest du selbst ausprobieren, nur eine der beiden Möglichkeiten ist richtig. Also prüfe beide genau.

Eine Schleife hat im Restart Skript jedenfalls nichts verloren, sonst würdest du bei jedem /restart einen Serverprozess mehr haben.
 

LapisMC

Kuhfänger
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
58
Alter
20
Minecraft
LapisMC
Eine Schleife hat im Restart Skript jedenfalls nichts verloren, sonst würdest du bei jedem /restart einen Serverprozess mehr haben.
Das ist mir klar. Ein Skript für die Restart-Funktion sollte natürlich anders aufgebaut sein; ich habe lediglich eine alternative Lösung vorgeschlagen.

Ich würde das als großen Nachteil sehen, aber jeder wie er meint.
Wieso ist das ein Nachteil? Problematisch ist eher eine stundenlange Downtime, wenn zum Zeitpunkt des Absturzes weder der Betreiber noch ein Sysadmin anwesend ist. Durch diesen Ansatz ist der Server sofort wieder verfügbar und die Ursache kann später behoben werden. Ich kenne keinen Fall, in dem ein Neustart zusätzliche Probleme verursachen würde. Mein Beispiel lässt sich noch beliebig um Wartezeiten zwischen Neustarts (sleep), Begrenzung der Startversuche, Logging/Alarmierung etc. erweitern.
 

❤️可愛いちゃん️❤️

Enderdragonjäger
Osterei Experte
Mitglied seit
19 Mai 2014
Beiträge
1.094
Alter
2
Das ist mir klar. Ein Skript für die Restart-Funktion sollte natürlich anders aufgebaut sein; ich habe lediglich eine alternative Lösung vorgeschlagen.
War auch wirklich nur als Hinweis für den TE gedacht, da ich gerade selbst versucht habe rauszufinden, wie Spigot den neuen Serverprozess erzeugt und im Internet nur irgendwelche Schleifen gefunden habe, die man für /restart nicht will. Hab mir nur gespart das ganze zu erklären, weil man dafür mehr Ahnung von Prozessmanagment haben müsste, was der TE vermutlich nicht hat.

Wieso ist das ein Nachteil? Problematisch ist eher eine stundenlange Downtime, wenn zum Zeitpunkt des Absturzes weder der Betreiber noch ein Sysadmin anwesend ist. Durch diesen Ansatz ist der Server sofort wieder verfügbar und die Ursache kann später behoben werden. Ich kenne keinen Fall, in dem ein Neustart zusätzliche Probleme verursachen würde. Mein Beispiel lässt sich noch beliebig um Wartezeiten zwischen Neustarts (sleep), Begrenzung der Startversuche, Logging/Alarmierung etc. erweitern.
Ein Fehler bedeutet, dass etwas schief lief. Wenn du den Server einfach wieder neustartest hast du keine Ahnung in welchem Zustand sich der Server befindet. Vielleicht wurden Dateien korrumpiert. Wenns richtig scheiße läuft haben danach alle User Zugriff aufs Hostsystem. Stell dir z.B. vor du hast ein Plugin dass dir Shellzugriff gibt und da die Rechte nicht richtig geladen wurden, hat nun jeder Spieler darauf Zugriff. Das mag jetzt ein sehr konstruiertes Beispiel sein, aber es ist möglich.

Anders kann man sich auch fragen, was bringt es Usern, wenn sie auf einem kaputten Server spielen können, der vermutlich sowieso zurückgesetzt werden muss. Vor allem kannst du dich danach durch die ganzen Restarts kämpfen und versuchen zu rekonstruieren was jetzt genau alles kaputt gegangen ist.
 

LapisMC

Kuhfänger
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
58
Alter
20
Minecraft
LapisMC
Ich habe meinen originalen Post noch einmal um eine Lösung per Spigot-Restartskript erweitert. Wie der Befehl wirklich funktioniert, ist dem Sourcecode zu entnehmen:
Java:
    private static void restart(final String restartScript)
    {
        AsyncCatcher.enabled = false; // Disable async catcher incase it interferes with us
        try
        {
            String[] split = restartScript.split( " " );
            if ( split.length > 0 && new File( split[0] ).isFile() )
            {
                System.out.println( "Attempting to restart with " + restartScript );

                // Disable Watchdog
                WatchdogThread.doStop();

                // Kick all players
                for ( EntityPlayer p : (List< EntityPlayer>) MinecraftServer.getServer().getPlayerList().players )
                {
                    p.playerConnection.disconnect(SpigotConfig.restartMessage);
                }
                // Give the socket a chance to send the packets
                try
                {
                    Thread.sleep( 100 );
                } catch ( InterruptedException ex )
                {
                }
                // Close the socket so we can rebind with the new process
                MinecraftServer.getServer().getServerConnection().b();

                // Give time for it to kick in
                try
                {
                    Thread.sleep( 100 );
                } catch ( InterruptedException ex )
                {
                }

                // Actually shutdown
                try
                {
                    MinecraftServer.getServer().stop();
                } catch ( Throwable t )
                {
                }

                // This will be done AFTER the server has completely halted
                Thread shutdownHook = new Thread()
                {
                    @Override
                    public void run()
                    {
                        try
                        {
                            String os = System.getProperty( "os.name" ).toLowerCase(java.util.Locale.ENGLISH);
                            if ( os.contains( "win" ) )
                            {
                                Runtime.getRuntime().exec( "cmd /c start " + restartScript );
                            } else
                            {
                                Runtime.getRuntime().exec( "sh " + restartScript );
                            }
                        } catch ( Exception e )
                        {
                            e.printStackTrace();
                        }
                    }
                };

                shutdownHook.setDaemon( true );
                Runtime.getRuntime().addShutdownHook( shutdownHook );
            } else
            {
                System.out.println( "Startup script '" + SpigotConfig.restartScript + "' does not exist! Stopping server." );

                // Actually shutdown
                try
                {
                    MinecraftServer.getServer().stop();
                } catch ( Throwable t )
                {
                }
            }
            System.exit( 0 );
        } catch ( Exception ex )
        {
            ex.printStackTrace();
        }
    }
Zusammengefasst wird nach dem vollständigen Programmende des Servers einfach per Runtime#exec() das Skript ausgeführt, in einem separaten Prozess. Somit wird der Screen beendet und muss innerhalb des Restartskripts erneut erzeugt werden.

Ein Fehler bedeutet, dass etwas schief lief. [...]
Was schiefgelaufen ist, kann aber stark variieren. Bei Bukkit/Spigot-Servern überwiegen meiner Erfahrung nach oft die Fälle, in denen nach einem Neustart erstmal alles normal weiterläuft. Was schiefgelaufen ist, sollte für die verantwortlichen Personen natürlich höchste Priorität haben, eine konstante Verfügbarkeit des Servers ist jedoch ebenfalls wichtig. Ersteres erfordert deren Anwesenheit, Letzteres kann jedoch sofort garantiert werden.
Wenns richtig scheiße läuft haben danach alle User Zugriff aufs Hostsystem. Stell dir z.B. vor du hast ein Plugin dass dir Shellzugriff gibt [...]
Ausgehend von einer normalen Spigot-Instanz ist so etwas nicht möglich. Durch Plugins könnte das natürlich eintreten, aber das müssen dann schon extrem unsichere und katastrophal umgesetzte Plugins sein. Und wer das Plugin aus deinem Beispiel benutzt, hat so oder so eine immense Sicherheitslücke erzeugt...
Anders kann man sich auch fragen, was bringt es Usern, wenn sie auf einem kaputten Server spielen können, der vermutlich sowieso zurückgesetzt werden muss.
Wie gesagt, nicht alle Abstürze bedeuten, dass der ganze Server kaputt ist. Bei Dingen wie "Entity X in Chunk Y konnte nicht richtig getickt werden" oder "xxUltraH4x0rPVPxx hat mit seinem Hack-Client ein manipuliertes Paket gesendet" ist es ein winziges Problem mit viel zu schwerwiegenden Folgen. Am besten ist die Prävention jeglicher Abstürze, falls das aber mal nicht funktioniert, kann der Schaden durch einen automatischen Restart meist begrenzt werden.
 

peaceguy

Schafhirte
Mitglied seit
17 Oktober 2013
Beiträge
139
Wie das mit dem Restart-Befehl abläuft, weiß ich nicht, eine einfache Lösung für automatische Restarts lässt sich aber durch das folgende Startskript umsetzen (ersetzt deine bereits vorhandene start.sh):
Startskript:
#!/bin/bash
rm STOP
until [ -f STOP ]; do
java -Xms10G -Xmx10G -jar /home/minecraft/spigot-1.13.2.jar
done
Dieses Skript kannst du dann in das Serververzeichnis packen und in einem Screen laufen lassen:
Startbefehl:
cd /home/minecraft/
screen -dmS minecraft sh start.sh
Wenn der Server dann gestoppt wird (ganz normal über /stop), startet er automatisch wieder neu, es sei denn, im Serververzeichnis befindet sich eine Datei namens STOP. Diese kannst du mit touch /home/minecraft/STOP erzeugen. Vorteilhaft ist auch, dass der Minecraft-Server auch im Falle eines Absturzes oder sonstigen unerwarteten Ausfalls sofort neustartet.

Edit:
Durch die Lösung oben bleibt die beim Start erstellte Screen-Session offen und der neugestartete Server läuft ebenfalls darin. Es handelt sich nicht um ein Restart-Script, dass du in die spigot.yml eintragen kannst, sondern bietet unabhängig davon ein ähnliches Ergebnis.

Falls du lieber mit der /restart-Funktion arbeiten willst, reicht dein Startskript eigentlich schon aus. Es wäre allerdings sinnvoller, eine Kopie davon im Serververzeichnis abzulegen. Das Skript erstellt einen neuen Screen, da der Alte durch das Herunterfahren des Servers ebenfalls beendet wird.
Das ist die Lösung, vielen Dank! Die /restart Funktion hat leider nie mit meinem Script funktioniert, aus welchen Gründen auch immer. Ich hab jetzt einfach noch ein Alias angelegt, sodass /restart zu /stop führt und nun klappt alles einwandfrei.
Also nochmal vielen Dank euch beiden!
 

peaceguy

Schafhirte
Mitglied seit
17 Oktober 2013
Beiträge
139
Hast du das Skript denn auch in der spigot.yml als restart-script angegeben? Wenn es im Serververzeichnis liegt und restart.sh heißt, müsste dort "./restart.sh" stehen.
Jap, das war alles korrekt angegeben. Keine Ahnung weshalb das nie funktioniert hat.
 
Allgemein
Hilfe Benutzer
  • ❤️可愛いちゃん️❤️ ❤️可愛いちゃん️❤️:
    Manchmal geh ich für ein paar Minuten raus weils zu kalt ist.
  • Hadde-chan Hadde-chan:
    Alles über 23 ist zu viel
  • Hadde-chan Hadde-chan:
    außer bei mecces. da steigt meine toleranz bis 45 grad. leider reicht selbst das nicht immer aus ._.
  • Stern☆ Stern☆:
    Dachte ihr habt Klima?
  • Stern☆ Stern☆:
    Ich hab bei mir im Garten heuer Melone angebaut und die wächst gut :D Wenn es so warm bleibt dann hab ich heuer Melonen ^^
  • Hadde-chan Hadde-chan:
    ne klimaanlage kommt aber nich gegen zwei große fritteusen an, diverse wärmelampen und nen großen grill xd
  • Hadde-chan Hadde-chan:
    achso und unsere toaster und diverse warmhaltegeräte und beheizte tische
  • Hadde-chan Hadde-chan:
    einfach alles strahlt wärme ab xD Dazu noch die kühlgeräte die ja auch wärme abstrahlen
  • Stern☆ Stern☆:
    Das ist böse ... bei uns gibt es da stellenweise auch aber da muss ich nicht arbeiten XD
  • Stern☆ Stern☆:
    ...nur manchmal hin wenn was kaputt ist ... das ist dann echt doof ^^
  • Stern☆ Stern☆:
    Bei dir klingt das wie die Dauerhölle ..
  • HardSoul HardSoul:
    Da bekommt man echt Mitleid :oops:
  • Hadde-chan Hadde-chan:
    es ist auch warm und du musst permanent trinken xD wer nicht trinkt verliert
  • iTz_Proph3t iTz_Proph3t:
    ich hab da kein mitleid mit
  • iTz_Proph3t iTz_Proph3t:
    so schlecht wie die burger von hadde immer sind ...
    +1
  • iTz_Proph3t iTz_Proph3t:
    It´s coming <3
  • Stern☆ Stern☆:
    Oha :D
  • HardSoul HardSoul:
    Kommt mir das nur so vor oder steigt die Anzahl der Menschen, die denken, dass das hier das Forum ihres Servers sei?
  • iTz_Proph3t iTz_Proph3t:
    ka, kann sein
  • iTz_Proph3t iTz_Proph3t:
    lesen ist auch schwer
  • HardSoul HardSoul:
    Das Gefühl habe ich manchmal auch. Genauso wie bei Grammatik, Satzbau und Rechtschreibung
  • Dean Dean:
    Moin
  • Stern☆ Stern☆:
    Morgen :)
  • LottaXL LottaXL:
    Moin, moin =)
  • HardSoul HardSoul:
    Morgen :)
    HardSoul HardSoul: Morgen :)
    Oben