![Wie erstelle ich einen Startdienst für einen Minecraft-Server, der über eine start.sh-Datei verfügt?](https://rvso.com/image/1071725/Wie%20erstelle%20ich%20einen%20Startdienst%20f%C3%BCr%20einen%20Minecraft-Server%2C%20der%20%C3%BCber%20eine%20start.sh-Datei%20verf%C3%BCgt%3F.png)
Ich habe einen modifizierten FTB-Server auf meinem Ubuntu-Server installiert, einen Benutzer und eine Gruppe namens „ftb“ erstellt und ihm ein eigenes Verzeichnis zugewiesen, /opt/ftb/
das einen Ordner mit den Serverdateien enthält. Im Serverordner befindet sich eine Datei start.sh zum Starten des Servers. Wie erstelle ich eine Systemdienstdatei, damit ich Befehle wie systemctl status ftbacademy.service
, systemctl start ftbacademy.service
, und verwenden kann systemctl stop ftbacademy.service
? Beim Stoppen des Servers möchte ich, dass er speichert und dann den Server schließt. Wie würde die .service-Datei aussehen? Ich weiß, dass sie in abgelegt werden muss /etc/systemd/system/
, aber ich weiß nicht, wie ich die Datei schreiben soll, die den ftb-Benutzer dazu bringt, sein eigenes virtuelles Terminal oder was auch immer zu öffnen, um die Welt zu retten und dann den Server zu stoppen.
Ubuntu Server Version 20.04.3
Verwendete FTB Academy 1.16 Server-Dateien-Download-Site:https://feed-the-beast.com/modpacks/88/server/2077Ich habe die Linux-Download-Option ausgewählt und dann die Installationsdatei ausgeführt, um die Serverdateien automatisch herunterzuladen.
Ich verwende außerdem eine andere Version des JDK zum Ausführen der Serverdatei, deshalb habe ich die Datei start.sh wie folgt geändert:
#!/bin/bash
if ! grep -q "eula=true" eula.txt; then
echo "Do you agree to the Mojang EULA available at https://account.mojang.com/documents/minecraft_eula ?"
read -N 1 -p "[y/n] " EULA
if [ "$EULA" = "y" ]; then
echo "eula=true" > eula.txt
echo
fi
fi
/usr/lib/jvm/java-11-openjdk-amd64/bin/java -javaagent:log4jfix/Log4jPatcher-1.0.0.jar -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -Xmx5000M -Xms4000M -jar forge-1.16.5-36.2.2.jar nogui
Antwort1
Ich habe eine Datei mit dem Namen [email protected]
am Speicherort erstellt /etc/systemd/system/
. Die Datei enthält Folgendes:
[Unit]
Description=FTB Server: %i
After=network.target
[Service]
WorkingDirectory=/opt/ftb/%i
User=ftb
Group=ftb
Restart=always
ExecStart=/usr/bin/screen -DmS mc-%i bash start.sh
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say SERVER SHUTTING DOWN IN 15 SECONDS..."\015'
ExecStop=/bin/sleep 5
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say SERVER SHUTTING DOWN IN 10 SECONDS..."\015'
ExecStop=/bin/sleep 5
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say SERVER SHUTTING DOWN IN 5 SECONDS..."\015'
ExecStop=/bin/sleep 5
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "save-all"\015'
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "stop"\015'
[Install]
WantedBy=multi-user.target
Dann habe ich systemctl enable ftb@academy
und verwendet systemctl start ftb@academy
, um den Server zu aktivieren und zu starten. Mir ist auch aufgefallen, dass ich dem ftb-Benutzer beim ersten Erstellen und Übertragen der Eigentümerschaft an den Ordner keine Berechtigungen für die Unterordner erteilt habe, sodass ihm die Berechtigung zum Starten des Servers verweigert wurde.
Antwort2
Beachten Sie die URL für die EULA im Skript. Sie werden lediglich gefragt, ob Sie die Bedingungen gelesen haben und diese akzeptieren, aber nur, wenn Sie nicht bereits gefragt wurden und mit „Ja“ geantwortet haben.
Nach dem ersten Ausführen werden daher immer nur die obersten und untersten Zeilen ausgeführt.
Die einfachste Möglichkeit, dies einzurichten (und auf lange Sicht Zeit zu sparen), besteht darin, in der letzten Zeile einen Alias für den Befehl hinzuzufügen, der die Serverdatei tatsächlich konfiguriert und startet. Dies kann folgendermaßen erfolgen:
MC_CMD='alias start_srvr="/usr/lib/jvm/java-11-openjdk-amd64/bin/java -javaagent:log4jfix/Log4jPatcher-1.0.0.jar -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -Xmx5000M -Xms4000M -jar forge-1.16.5-36.2.2.jar nogui"' && echo "${MC_CMD}" >> ~/.bash_aliases || echo "${MC_CMD}" >> ~/.bashrc
Das Ausführen des oben hinzugefügten Befehls stellt lediglich eine kleine Vereinfachung dar, sodass Sie sich nicht darum kümmern müssen, das Skript hinzuzufügen PATH
oder bei jedem Starten Ihres Servers den relativen Pfad zu berechnen oder den vollständigen Pfad einzugeben.
Wenn Sie sich jemals dazu entschließen, den Server zu löschen, können Sie den „Befehl“ entfernen, indem ~/.bash_aliases
Sie die einzelne Zeile, die ihn enthält, bearbeiten und entfernen.