Minecraft Start/Stop/Backup

Das hier ist mein Skript für den Minecraftserver:

Ihr braucht auf jeden Fall „screen“

sudo apt-get update; sudo apt-get install screen

Mit einem Editor erstellt ihr das file minecraft. Ich habe es unter /home/minecraft/bin/ gespeichert.

mkdir -p /home/minecraft/bin/;nano /home/minecraft/bin/minecraft
#!/bin/bash
#
# ---------------------------------------------------------------------------
# minecraft - Start - Stop - Restart - Backup -Script für den minecraftserver
#
# Copyright 2017, Christian Müller christian.mueller@elektro-fred.de
#
# Dieses Programm ist freie Software: Sie können es weitergeben und / oder modifizieren
# es unter den Bedingungen der GNU General Public License, wie von veröffentlicht
# die Free Software Foundation, entweder Version 3 der Lizenz, oder
# (nach Ihrer Wahl) eine spätere Version.
#
# Dieses Programm wird in der Hoffnung verbreitet, dass es nützlich sein wird,
# aber OHNE GARANTIE; ohne auch nur die implizite garantie von
# MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die
# GNU General Public License unter <http://www.gnu.org/licenses/> für
# mehr Details.
#
# Verwendung: minecraft [h]
# [st  Startet den minecraftserver in einem Screen und loggt sich dort auch gleich ein]
# [sp  Stoppt den minecraftserver und beendet den Screen]
# [c  Loggt sich in den Screen ein und öffnet die Serverkonsole]
# [r  Startet den minecraftserver neu und loggt sich in den Screen ein]
# [b  Der komplette minecraftserver wird gesichert]
#
# Revision history:
# 2019-09-20 Ausgaben auf deutsch übersetzt. Anpassung "Verwendung" | Christian Müller | V1.1
# 2019-09-21 Scriptcode leserlich gestaltet | Christian Müller | V1.2
# 2019-10-02 Slack-Ausgaben eingefügt | Chritian Müller | V1.3
# 2019-01-16 Funktion Geisterstunde hinzugefügt | Christian Müller | V1.4
# 2020-06-08 Slack-Ausgabe Datensicherung nur noch bei error_exit oder über Variable SLACK=1 | Christian Müller | V1.5
# 2020-08-19 JAVA-Aufruf mit PID-File für Überwachung Monit | Christian Müller | V1.6
#
#
# ---------------------------------------------------------------------------

PROGNAME=${0##*/}
VERSION="1.6"
PATH=$PATH

. minecraft.conf

clean_up() { # Perform pre-exit housekeeping
  return
}

error_exit() {
  echo -e "${PROGNAME}: ${1:-"Unknown Error"}" >&2
  slack server Minecraft: ${PROGNAME}: ${1:-"Unknown Error"}
  clean_up
  exit 1
}

error_exit2() {
        echo -e "${PROGNAME}: "GEISTERSTUNDE" ${1:-"Unknown Error"}" >&2
        slack server Minecraft: ${PROGNAME}: ${1:-"Unknown Error"}
        clean_up
        exit 1
}

graceful_exit() {
  clean_up
  exit
}

signal_exit() { # Handle trapped signals
  case $1 in
    INT)
      error_exit "Program interrupted by user" ;;
    TERM)
      echo -e "\n$PROGNAME: Program terminated" >&2
      graceful_exit ;;
    *)
      error_exit "$PROGNAME: Terminating on unknown signal" ;;
  esac
}

usage() {
  echo -e "Verwendung: $PROGNAME [h]\n [st]  Startet den minecraftserver in einem Screen und loggt sich dort auch gleich ein\n [sp]  Stoppt den minecraftserver und beendet den Screen\n [c]  Loggt sich in den Screen ein und öffnet die Serverkonsole\n [r]  Startet den minecraftserver neu und loggt sich in den Screen ein\n [b]  Der komplette minecraftserver wird gesichert\n [g] [st|sp] Gibt die Meldung Geisterstunde aus und startet die Geister"
}

help_message() {
  cat <<- _EOF_
  $PROGNAME ver. $VERSION
  Start - Stop - Restart - Backup -Script für den minecraftserver

  $(usage)

  Options:
  h  Diese Hilfemeldung anzeigen und beenden.
  st  Startet den minecraftserver in einem Screen und loggt sich dort auch gleich ein.
  sp  Stoppt den minecraftserver und beendet den Screen.
  c  Loggt sich in den Screen ein und öffnet die Serverkonsole.
  r  Stoppt und startet den minecraftserver neu. Loggt sich anschließend in den Screen ein.
  b  Der komplette minecraftserver wird im laufenden Betrieb gesichert.
  g st|sp  Gibt die Meldung Geisterstunde Beginn|Ende aus und startet|stoppt die Geister.

_EOF_
  return
}

# Trap signals
trap "signal_exit TERM" TERM HUP
trap "signal_exit INT"  INT

# Main logic
        case $1 in
                -h | --help | h | help)
                help_message; graceful_exit
                ;;
                -start | --start | start | st)
                cd "$MC_ROOT"; screen -dmS "$MC_SCREEN" $JAVA
                sleep 1
                slack server minecraft: $PROGNAME $VERSION: Minecraft-Server start
                while [ $sek -ge 1 ];do
                        echo -en "\rEinen Moment bitte, noch $sek Sekunden..."
                        sleep 1
                        sek=$[$sek-1]
                done
                echo
                echo "Wartezeit beendet!"
                screen -S "$MC_SCREEN" -X stuff 'setblock -3 111 9 minecraft:redstone_block\n'
                screen -S "$MC_SCREEN" -X stuff 'say Sämtlichte Technik ist aktiv\n'
                sleep 3
                screen -x -r $MC_SCREEN
                ;;
                -stop | --stop | stop | sp)
                echo "Wartezeit 3 Minuten - Technik wird deaktiviert"
                screen -S "$MC_SCREEN" -X stuff 'say Server wird in 3 Minuten'$Nachricht' angehalten!\n'
                sleep 60
                echo "Wartezeit 2 Minuten"
                screen -S "$MC_SCREEN" -X stuff 'say Server wird in 2 Minuten'$Nachricht' angehalten!\n'
                sleep 60
                echo "Wartezeit 1 Minuten"
                screen -S "$MC_SCREEN" -X stuff 'say Server wird in 1 Minuten'$Nachricht' angehalten!\n'
                sleep 57
                echo "Server stoppt"
                screen -S "$MC_SCREEN" -X stuff 'say Server hält an!\n'
                sleep 3
                screen -S "$MC_SCREEN" -X stuff 'stop\n';screen -D -r "$MC_SCREEN"
                slack server minecraft: $PROGNAME $VERSION: Minecraft-Server stoppt
                ;;
                -console | --console | c | console)
                screen -x -r "$MC_SCREEN"
                ;;
                -restart | --restart | restart | r)
                echo "Wartezeit 3 Minuten - Technik wird deaktiviert"
                screen -S "$MC_SCREEN" -X stuff 'say Server wird in 3 Minuten'$Nachricht' neu gestartet!\n'
                sleep 60
                echo "Wartezeit 2 Minuten"
                screen -S "$MC_SCREEN" -X stuff 'say Server wird in 2 Minuten'$Nachricht' neu gestartet!\n'
                sleep 60
                echo "Wartezeit 1 Minuten"
                screen -S "$MC_SCREEN" -X stuff 'say Server wird in 1 Minute'$Nachricht' neu gestartet!\n'
                sleep 57
                echo "Server startet neu!"
                screen -S "$MC_SCREEN" -X stuff 'say Server startet neu!\n'
                sleep 3
                screen -S "$MC_SCREEN" -X stuff 'stop\n';screen -D -r "$MC_SCREEN"
                slack server minecraft: Server startet neu
                echo "Wartezeit 2 Minuten - danach Server Start"
                sleep 60
                echo "Starte Server in einer Minute"
                echo "cd "$MC_ROOT"; screen -dmS "$MC_SCREEN" "$JAVA"" | at now + 1min
                sleep 60
                while [ $sek -ge 1 ];do
                        echo -en "\rEinen Moment bitte, noch $sek Sekunden..."
                        sleep 1
                        sek=$[$sek-1]
                done
                echo
                echo "Wartezeit beendet!"
                screen -x -r $MC_SCREEN
                ;;
                -backup | --backup | backup | b)
                LOCKDIR="/run/lock/minecraft_backup"
                PIDFILE="${LOCKDIR}/minecraft_backup.pid"
                ENO_SUCCESS=0; ETXT[0]="ENO_SUCCESS"
                ENO_GENERAL=1; ETXT[1]="ENO_GENERAL"
                ENO_LOCKFAIL=2; ETXT[2]="ENO_LOCKFAIL"
                ENO_RECVSIG=3; ETXT[3]="ENO_RECVSIG"
                trap 'ECODE=$?; echo "[statsgen] Exit: ${ETXT[ECODE]}($ECODE)" >&2' 0
                echo -n "[statsgen] Blockieren: " >&2
                if mkdir "${LOCKDIR}" &>/dev/null; then
                        trap 'ECODE=$?;
                        echo "[statsgen] Entferne Blockierung. Exit: ${ETXT[ECODE]}($ECODE)" >&2
                        rm -rf "${LOCKDIR}"' 0
                        echo "$$" >"${PIDFILE}"
                        trap 'echo "[statsgen] Durch Signal getötet." >&2
                        error_exit ${ENO_RECVSIG}' 1 2 3 15
                        echo "Erfolg, installierte Signal-Handler"
                else
                        OTHERPID="$(cat "${PIDFILE}")"
                        if [ $? != 0 ]; then
                                echo "Sperre fehlgeschlagen, PID ${OTHERPID} ist aktiv." >&2
                                error_exit ${ENO_LOCKFAIL}
                        fi
                        if ! kill -0 $OTHERPID &>/dev/null; then
                                echo "Entfernen der veralteten Sperre der nicht vorhandenen PID ${OTHERPID}" >&2
                                rm -rf "${LOCKDIR}"
                                echo "[statsgen] mich neu starten" >&2
                                exec "$0" "$@"
                        else
                                echo "Sperre fehlgeschlagen, PID ${OTHERPID} ist aktiv." >&2
                                error_exit ${ENO_LOCKFAIL}
                        fi
                fi
                export TERM=${TERM:-dumb}

                STAMP=`date +%d-%m-%Y_%H%M%S`

                if [ $SLACK -eq 1 ]; then
                        slack server minecraft: $(date +"%G-%m-%d %H:%M:%S") [LOG] Starten des AutoBackup-Skripts...
                        slack server minecraft: $(date +"%G-%m-%d %H:%M:%S") [LOG] Arbeiten im Verzeichnis: $PWD.
                fi

                BACKUPDATE=`date +%d-%m-%Y`
                FINALDIR="$BACKUPDIR/$BACKUPDATE"
                FINALDIR2="$BACKUPDIR2/$BACKUPDATE"

                if [ $SLACK -eq 1 ]; then
                        slack server minecraft: $(date +"%G-%m-%d %H:%M:%S") [LOG] Überprüfen, ob Backup-Ordner vorhanden sind, wenn nicht, dann sie erstellen.
                fi

                if [ -d $BACKUPDIR ];then
                        echo -n < /dev/null
                        else
                                mkdir "$BACKUPDIR"
                        if [ $SLACK -eq 1 ];then
                                slack server minecraft: $(date +"%G-%m-%d %H:%M:%S") [LOG] Erstelle Ordner: $BACKUPDIR
                        fi
                fi

                if [ -d $BACKUPDIR2 ];then
                        echo -n < /dev/null
                else
                        mkdir "$BACKUPDIR2"
                        if [ $SLACK -eq 1 ];then
                                slack server minecraft: $(date +"%G-%m-%d %H:%M:%S") [LOG] Erstelle Ordner: $BACKUPDIR2
                        fi
                fi

                if [ -d "$FINALDIR" ];then
                        echo -n < /dev/null
                else
                        mkdir "$FINALDIR"
                        if [ $SLACK -eq 1 ];then
                                slack server minecraft: $(date +"%G-%m-%d %H:%M:%S") [LOG] Erstelle Ordner: $FINALDIR
                        fi
                fi

                if [ -d "$FINALDIR2" ];then
                        echo -n < /dev/null
                else
                        mkdir "$FINALDIR2"
                        if [ $SLACK -eq 1 ];then
                                slack server minecraft: $(date +"%G-%m-%d %H:%M:%S") [LOG] Erstelle Ordner: $FINALDIR2
                        fi
                fi

                if [ $OLDBACKUPS -lt 0 ];then
                        OLDBACKUPS=3
                fi

                if [ $SLACK -eq 1 ];then
                        slack server minecraft: $(date +"%G-%m-%d %H:%M:%S") [LOG] Entfernen von Sicherungen, die älter als $OLDBACKUPS Tage sind.
                fi

                OLDBACKUP=`find $BACKUPDIR -type d -mtime +$OLDBACKUPS | grep -v -x "$BACKUPDIR" | xargs rm -rf`
                OLDBACKUP2=`find $BACKUPDIR2 -type d -mtime +$OLDBACKUPS | grep -v -x "$BACKUPDIR2" | xargs rm -rf`

                if [ $NOTIFY -eq 1 ];then
                        screen -x $SCREENNAME -X stuff "`printf "say Entfernen von Sicherungen, die älter als $OLDBACKUPS Tage sind.\r"`"
                fi

                $OLDBACKUP
                $OLDBACKUP2

                if [ $NOTIFY -eq 1 ];then
                        screen -x $SCREENNAME -X stuff "`printf "say Alte Backups entfernt.\r"`"
                fi

                BFILE=""

                for WORLD in "${WORLDS[@]}";do
                        BFILE="$WORLD.$STAMP.tar.gz"

                        if [ $SLACK -eq 1 ];then
                                slack server minecraft: $(date +"%G-%m-%d %H:%M:%S") [LOG] Welt-Name ist $WORLD
                        fi

                        if [ $NOTIFY -eq 1 ];then
                                screen -x $SCREENNAME -X stuff "`printf "say Sicherung $WORLD!\r"`"
                        fi

                        tar -czf $FINALDIR/$BFILE $SOURCE/$WORLD
                        tar -czf $FINALDIR2/$BFILE $SOURCE/$WORLD

                        if [ $SLACK -eq 1 ];then
                                slack server minecraft: $(date +"%G-%m-%d %H:%M:%S") [LOG] Ordner $WORLD in eine TAR-Datei packen und komprimieren: $FINALDIR/$BFILE
                        fi

                        if [ $NOTIFY -eq 1 ];then
                                screen -x $SCREENNAME -X stuff "`printf "say Sicherung für $WORLD fertiggestellt!\r"`"
                        fi
                done

                if [ $AUTOSAVE -eq 1 ];then
                        if [ $NOTIFY -eq 1 ];then
                                screen -x $SCREENNAME -X stuff "`printf "say Speichern erzwingen...\r"`"
                        fi
                        screen -x $SCREENNAME -X stuff `printf "save-all\r"`
                        sleep 2
                fi

                if [ $NOTIFY -eq 1 ];then
                        screen -x $SCREENNAME -X stuff "`printf "say Welten packen und komprimieren...\r"`"
                fi

                screen -x $SCREENNAME -X stuff "`printf "save-off\r"`"
                screen -x $SCREENNAME -X stuff "`printf "save-on\r"`"

                if [ ! -d "$BACKUPDIR/$BACKUPDATE" ]; then
                        mkdir $BACKUPDIR/$BACKUPDATE
                fi

                if [ ! -d "$BACKUPDIR2/$BACKUPDATE" ]; then
                        mkdir $BACKUPDIR2/$BACKUPDATE
                fi

                rsync -azvPh -no-g -no-o -no-D $BACKUPDIR/$BACKUPDATE/* $BACKUPDIR2/$BACKUPDATE/
                rm -vfr $BACKUPDIR/$BACKUPDATE

                if [ $NOTIFY -eq 1 ];then
                        screen -x $SCREENNAME -X stuff "`printf "say Sicherung abgeschlossen.\r"`"
                fi

                if [ $SLACK -eq 1 ];then
                        slack server minecraft: $(date +"%G-%m-%d %H:%M:%S") [LOG] Sicherung abgeschlossen.
                fi
                ;;
                -g | --g | g | -geisterstunde | --geisterstunde | geisterstunde | -geist | --geist | geist)
                case $2 in
                        st | start | -start | --start)
                        screen -S "$MC_SCREEN" -X stuff 'say Die Geisterstunde beginnt!\n'
                        ;;
                        sp | stop | -stop | --stop)
                        screen -S "$MC_SCREEN" -X stuff 'say Die Geisterstunde ist zu Ende!\n'
                        ;;
                        -* | --* | *)
                        usage
                        error_exit "GEISTERSTUNDE: Unbekannte Option $2"
                        ;;
                esac
                ;;
                -* | --* | *)
                usage
                error_exit "Unbekannte Option $1"
                ;;
        esac
        shift

graceful_exit

Danach noch ausführbar machen.

chmod +x /home/minecraft/bin/minecraft

Als nächstes die minecraft.conf -Datei mit den ganzen Variablen erstellen.

!ACHTUNG! Die Datei beinhaltet Beispiele, diese unbedingt anpassen.

nano /home/minecraft/bin/minecraft.conf
#
# ---------------------------------------------------------------------------
# Konfigurationsdatei für die Minecraft-Scripte
# Copyright 2020 , Christian Müller christian.mueller@elektro-fred.de
#
# Dieses Programm ist freie Software: Sie können es weitergeben und / oder modifizieren
# es unter den Bedingungen der GNU General Public License, wie von veröffentlicht
# die Free Software Foundation, entweder Version 3 der Lizenz, oder
# (nach Ihrer Wahl) eine spätere Version.
#
# Dieses Programm wird in der Hoffnung verbreitet, dass es nützlich sein wird,
# aber OHNE GARANTIE; ohne auch nur die implizite garantie von
# MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die
# GNU General Public License unter <http://www.gnu.org/licenses/> für
# mehr Details.
#
#
# Revision history:
# 2020-12-11 Erstellung | Christian Müller | V1.0
#
# ---------------------------------------------------------------------------

#######################################################################################
#
# Parameter für das ganze Script
#
#######################################################################################

MC_ROOT="/home/minecraft/minecraft"
 # Pfad zur Minecraftinstallation
MC_SCREEN="minecraft"
               # Name für den Screen
PROGRAMM="spigot-1.16.4.jar"
        # Name der Minecraftserver-JAR-Datei

# Java
XMS="1G"
XMX="12G"
JAVA="java -Xms"$XMS" -Xmx"$XMX" -d64 -jar -Djline.terminal=jline.UnsupportedTerminal $PROGRAMM nogui"

# Wartezeit in Sekunden
 bis Server neu startet/stoppt
sek=60
Nachricht=", wegen $2"

#######################################################################################
#
# Parameter für das Backup
#
#######################################################################################

SCREENNAME="minecraft"
AUTOSAVE=1
NOTIFY=1
SLACK=0
BACKUPDIR="/tmp/minecraft_backup"
BACKUPDIR2="/mnt/minecraft_backup"
 # Pfad für das endgültige Backup
PROPFILE="server.properties"
SCP=0
OLDBACKUPS=2
# WORLDS ==> Trennzeichen ist Leerzeichen
WORLDS=(welt1 welt2 nether the_end)
# Pfadangabe Ordner für Welten
SOURCE=/home/minecraft/minecraft

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.