Automatyczny start serwera Minecraft: usługa systemd i cronjob

Opublikowano Zaktualizowano 4 min czytania

Po restarcie serwer Minecraft ma wstać sam z siebie. Pokazujemy jednostkę usługi systemd jako czystą drogę oraz cronjob z @reboot jako szybką alternatywę.

Chcesz, żeby twój serwer Minecraft po restarcie serwera root sam wracał do sieci, bez logowania się przez SSH? Dobrze trafiłeś.

Pokażemy dwie drogi: jednostkę usługi systemd jako rozwiązanie czyste i zalecane oraz klasyczny cronjob z @reboot jako szybką alternatywę. Oba warianty działają na wszystkich popularnych dystrybucjach Linuksa, a więc na Debianie, Ubuntu, AlmaLinux oraz Rocky Linux.

systemd czy cronjob: która droga jest właściwa?

Cronjob z @reboot da się ustawić w chwilę, ale zna tylko jeden moment: start systemu. Jeśli coś pójdzie wtedy nie tak albo serwer padnie później, nic więcej się nie wydarzy.

Jednostka usługi systemd to droga czysta, która daje kilka przewag:

  • Serwer startuje dopiero wtedy, gdy sieć jest naprawdę gotowa, a nie po zgadywanym czasie oczekiwania.
  • Po awarii systemd uruchamia serwer ponownie automatycznie.
  • Serwerem sterujesz znanymi poleceniami systemctl start, stop, restart oraz status.
  • Komunikaty o błędach trafiają do journala i prześledzisz je poleceniem journalctl.

Dlatego zalecamy drogę przez systemd. Cronjoba opisujemy niżej jako alternatywę na wypadek, gdyby systemd nie był dostępny.

Przygotowanie: zanotuj polecenie startowe, użytkownika i katalog

Zanim zaczniesz, potrzebujesz trzech informacji ze swojej dotychczasowej instalacji:

  • Polecenia startowego z pliku „start.sh”, czyli na przykład screen -dmS spigot java -Xmx4G -jar spigot.jar
  • Użytkownika, na którego koncie działa serwer, w przykładzie „spigot”
  • Katalogu, w którym leży plik serwera, w przykładzie /home/spigot/server

Typowa zawartość pliku start.sh wygląda tak:

#To jest tylko przykład! Użyj zawartości własnego pliku start.sh.

screen -S spigot java -Xmx2G -jar spigot.jar

Ważne: na potrzeby automatycznego startu screen -S musi bezwzględnie zmienić się w screen -dmS. Powód: screen -S otwiera sesję interaktywną i oczekuje terminala. Przy starcie systemu terminala nie ma, więc uruchomienie by się nie powiodło. screen -dmS startuje sesję od razu w tle.

Jeśli nie masz jeszcze skonfigurowanego żadnego serwera Minecraft, zacznij od naszego poradnika Instalacja serwera Minecraft na Debianie.

Tworzenie jednostki usługi systemd dla serwera Minecraft

Utworzenie pliku jednostki

Utwórz jako root nowy plik usługi:

nano /etc/systemd/system/minecraft.service

Wpisz do niego poniższą zawartość i dopasuj użytkownika, katalog, pamięć RAM oraz nazwę pliku do własnej instalacji:

[Unit]
Description=Minecraft-Server
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
User=spigot
WorkingDirectory=/home/spigot/server
ExecStart=/usr/bin/screen -dmS spigot java -Xmx4G -jar spigot.jar
ExecStop=/usr/bin/screen -S spigot -X stuff "stop\n"
Restart=on-failure
RestartSec=15

[Install]
WantedBy=multi-user.target

Najważniejsze wiersze w skrócie:

  • After oraz Wants dbają o to, żeby serwer wystartował dopiero wtedy, gdy sieć jest dostępna.
  • User ustala, na koncie którego użytkownika działa serwer. Nigdy nie uruchamiaj go jako root.
  • WorkingDirectory to katalog z plikiem serwera. Bez tego wpisu Java nie znajdzie pliku JAR.
  • ExecStop wysyła do sesji screen polecenie „stop”. Dzięki temu serwer porządnie zapisuje świat, zamiast zostać po prostu ubity.
  • Restart=on-failure uruchamia serwer ponownie po awarii, a RestartSec ustala czas oczekiwania w sekundach.

Zapisz plik kombinacją „CTRL + X”, potem „Y” i „Enter”.

Aktywacja i uruchomienie usługi

Następnie systemd wczyta nowy plik, włączy autostart i od razu uruchomi serwer:

systemctl daemon-reload
systemctl enable --now minecraft

Aktualny stan sprawdzisz poleceniem:

systemctl status minecraft

Jeśli w wyjściu widnieje „active”, usługa działa. Przy problemach dokładny komunikat błędu znajdziesz w journalu:

journalctl -u minecraft -n 50

Dostęp do konsoli serwera

Serwer nadal działa w sesji screen. Ponieważ należy ona do użytkownika „spigot”, przełącz się najpierw na tego użytkownika, a dopiero potem otwórz konsolę:

su spigot
screen -r spigot

Kombinacją „CTRL + A + D” opuścisz konsolę bez zatrzymywania serwera.

Zatrzymanie i restart serwera

Od tej pory serwerem sterujesz przez systemd:

systemctl stop minecraft
systemctl restart minecraft

Jeśli autostart ma zostać znowu wyłączony, wystarczy:

systemctl disable minecraft

Alternatywa: autostart przez cronjoba z @reboot

Jeśli nie chcesz zakładać jednostki usługi, autostart uzyskasz również przez crontaba danego użytkownika. Otwórz crontaba poleceniem:

export VISUAL=nano; crontab -e

Dopisz swoje polecenie startowe jako ostatni wiersz, poprzedzone przedrostkiem @reboot:

@reboot <zawartość twojego pliku start.sh>

#Tak mniej więcej powinien wyglądać parametr startowy, u ciebie może się różnić w zależności od skryptu startowego.

@reboot screen -dmS <nazwa-screena> java -Xmx<AMOUNT>G -jar <katalog i nazwa pliku serwera Minecraft>.jar


#PRZYKŁAD:
@reboot screen -dmS spigot java -Xmx2G -jar /home/spigot/spigot.jar

Zwróć również tutaj uwagę na to, żeby użyć screen -dmS, a nie screen -S. Jak w ten sam sposób uruchamiać przy starcie serwera dowolne inne aplikacje i skrypty, pokazuje nasz poradnik Automatyczne uruchamianie programów przy starcie serwera.

Test autostartu

Nie zakładaj z góry, że konfiguracja jest poprawna, tylko sprawdź to świadomie. Zrestartuj serwer:

reboot

Odczekaj minutę albo dwie, zaloguj się ponownie przez SSH i sprawdź poleceniem systemctl status minecraft lub screen -ls, czy serwer Minecraft znowu działa. Połącz się dodatkowo klientem gry, żeby mieć pewność, że serwer jest naprawdę osiągalny.

Najczęstsze błędy przy autostarcie

  • screen -S zamiast screen -dmS: zdecydowanie najczęstszy błąd. Bez -dm serwer nie wystartuje przy bootowaniu.
  • Zły katalog: Java nie znajduje pliku JAR. Sprawdź WorkingDirectory albo podaj w cronjobie pełną ścieżkę do pliku JAR.
  • Zły użytkownik: jeśli usługa działa jako root, nowo utworzone pliki świata należą potem do roota, a właściwy użytkownik serwera nie może już w nich zapisywać.
  • Za mało pamięci RAM: jeśli wartość za -Xmx jest większa niż wolna pamięć RAM, kernel zakończy proces Javy krótko po starcie.

Najczęstsze pytania

systemd czy cronjob: co jest lepszą drogą?
Jednostka usługi systemd to czystsze rozwiązanie. Uruchamia serwer dopiero wtedy, gdy sieć jest gotowa, po awarii restartuje go automatycznie i obsługujesz ją poleceniami systemctl start, stop oraz status. Cronjob z @reboot nie daje żadnej z tych możliwości.
Dlaczego screen -S trzeba zmienić na screen -dmS?
screen -S otwiera sesję interaktywną i oczekuje terminala. Przy starcie systemu terminala nie ma, dlatego uruchomienie się nie udaje. screen -dmS startuje sesję w tle i jest tym samym właściwym wariantem dla autostartu.
Jak dostać się do konsoli serwera po automatycznym starcie?
Zaloguj się najpierw jako użytkownik, na którego koncie działa usługa, a potem otwórz sesję poleceniem screen -r. Sesja screen należy zawsze tylko do tego użytkownika, który ją uruchomił.
Czy systemd zrestartuje mój serwer również po awarii?
Tak, o ile w pliku jednostki ustawisz Restart=on-failure. systemd uruchomi wtedy serwer ponownie po czasie oczekiwania podanym w RestartSec.
Jak sprawdzić, czy autostart naprawdę działa?
Zrestartuj serwer świadomie poleceniem reboot, a następnie sprawdź poleceniem systemctl status minecraft, czy usługa działa. Przy błędach dokładny komunikat pokaże journalctl -u minecraft.

Serwer Minecraft Autostart systemd Zadania cron Crontab Linux Serwery gier Debian