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
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License at <http://www.gnu.org/licenses/> for
# more details.
# Usage: $PROGNAME [-h|--help] [-start|--start Startet den Minecraftserver in einem Screen und loggt sich dort auch gleich ein] [-stop|--stop Stoppt den Minecraftserver und beendet den Screen] [-console|--console Loggt sich in den Screen ein und öffnet die Serverkonsole] [-restart|--restart Startet den Minecraftserver neu und loggt sich in den Screen ein] [-backup|--backup Der komplette Minecraftserver wird gesichert]
# Revision history:
# 2016-11-15 Created by new_script ver. 3.3
# ---------------------------------------------------------------------------
PROGNAME=${0##*/}
VERSION="1.0"
PATH=$PATH
clean_up() { # Perform pre-exit housekeeping
return
}
error_exit() {
echo -e "${PROGNAME}: ${1:-"Unknown Error"}" >&2
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 "Usage: $PROGNAME [-h|--help]\n [-start|--start Startet den Minecraftserver in einem Screen und loggt sich dort auch gleich ein]\n [-stop|--stop Stoppt den Minecraftserver und beendet den Screen]\n [-console|--console Loggt sich in den Screen ein und öffnet die Serverkonsole]\n [-restart|--restart Startet den Minecraftserver neu und loggt sich in den Screen ein]\n [-backup|--backup Der komplette Minecraftserver wird gesichert]"
}
help_message() {
cat <<- _EOF_ $PROGNAME ver. $VERSION Start - Stop - Restart - Backup -Script für den Minecraftserver $(usage) Options: -h, --help Display this help message and exit. -start, --start Startet den Minecraftserver in einem Screen und loggt sich dort auch gleich ein -stop, --stop Stoppt den Minecraftserver und beendet den Screen -console, --console Loggt sich in den Screen ein und öffnet die Serverkonsole -restart, --restart Startet den Minecraftserver neu und loggt sich in den Screen ein -backup, --backup Der komplette Minecraftserver wird gesichert _EOF_ return } # Trap signals trap "signal_exit TERM" TERM HUP trap "signal_exit INT" INT # Parse command-line ####################################################################################### # # Hier Parameter anpassen # ####################################################################################### MC_ROOT="/home/minecraft/minecraft" # Hier befindet sich die Serverdatei MC_SCREEN="minecraft" # Name des screen PROGRAMM="craftbukkit-1.12.1.jar" # Dateiname des Minecraftservers ####################################################################################### while [[ -n $1 ]]; do case $1 in -h | --help) help_message; graceful_exit ;; -start | --start) sek=240 cd "$MC_ROOT"; screen -dmRRS "$MC_SCREEN" -R java -Xms1G -Xmx8G -d64 -jar $PROGRAMM nogui screen -x -r $MC_SCREEN ;; -stop | --stop) screen -S "$MC_SCREEN" -X stuff 'say Server wird in 3 Minuten angehalten!\n' sleep 60 screen -S "$MC_SCREEN" -X stuff 'say Server wird in 2 Minuten angehalten!\n' sleep 60 screen -S "$MC_SCREEN" -X stuff 'say Server wird in 1 Minuten angehalten!\n' sleep 57 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" ;; -console | --console) screen -x -r "$MC_SCREEN" ;; -restart | --restart) screen -S "$MC_SCREEN" -X stuff 'say Server wird in 3 Minuten neu gestartet!\n' sleep 60 screen -S "$MC_SCREEN" -X stuff 'say Server wird in 2 Minuten neu gestartet!\n' sleep 60 screen -S "$MC_SCREEN" -X stuff 'say Server wird in 1 Minute neu gestartet!\n' sleep 57 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" sleep 120 echo "cd " $MC_ROOT "; screen -dmS " $MC_SCREEN " java -Xms1G -Xmx8G -d64 -jar $PROGRAMM nogui" | at now + 1min sleep 62 screen -x -r $MC_SCREEN ;; -backup | --backup) 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] Locking: " >&2
if mkdir "${LOCKDIR}" &>/dev/null; then
trap 'ECODE=$?;
echo "[statsgen] Removing lock. Exit: ${ETXT[ECODE]}($ECODE)" >&2
rm -rf "${LOCKDIR}"' 0
echo "$$" >"${PIDFILE}"
trap 'echo "[statsgen] Killed by a signal." >&2
error_exit ${ENO_RECVSIG}' 1 2 3 15
echo "success, installed signal handlers"
else
OTHERPID="$(cat "${PIDFILE}")"
if [ $? != 0 ]; then
echo "lock failed, PID ${OTHERPID} is active" >&2
error_exit ${ENO_LOCKFAIL}
fi
if ! kill -0 $OTHERPID &>/dev/null; then
echo "removing stale lock of nonexistant PID ${OTHERPID}" >&2
rm -rf "${LOCKDIR}"
echo "[statsgen] restarting myself" >&2
exec "$0" "$@"
else
echo "lock failed, PID ${OTHERPID} is active" >&2
error_exit ${ENO_LOCKFAIL}
fi
fi
export TERM=${TERM:-dumb}
#######################################################################################
#
# Hier Parameter anpassen
#
#######################################################################################
SCREENNAME="minecraft" # Name des screen
AUTOSAVE=1 # Automatik ein/aus ( 1|0 )
NOTIFY=1 # Benachrichtigung ein/aus ( 1|0 )
BACKUPDIR="/tmp/minecraft_backup" # Backup im Tempbereich erstellen
BACKUPDIR2="/mnt/minecraft_backup" # Zielort des Backups
PROPFILE="server.properties" # Servereinstellungen sichern
OLDBACKUPS=2 # Wieviele Backups sollen aufgehoben werden
LOGIT=1 # Logeinträge ein/aus ( 1|0 )
#######################################################################################
STAMP=`date +%d-%m-%Y_%H%M%S`
if [ $LOGIT -eq 1 ]; then
echo "$(date +"%G-%m-%d %H:%M:%S") [LOG] Starting AutoBackup Script.."
echo "$(date +"%G-%m-%d %H:%M:%S") [LOG] Working in directory: $PWD."
fi
BACKUPDATE=`date +%d-%m-%Y`
FINALDIR="$BACKUPDIR/$BACKUPDATE"
FINALDIR2="$BACKUPDIR2/$BACKUPDATE"
if [ $LOGIT -eq 1 ]; then
echo "$(date +"%G-%m-%d %H:%M:%S") [LOG] Checking if backup folders exist, if not then create them."
fi
if [ -d $BACKUPDIR ];then
echo -n < /dev/null
else
mkdir "$BACKUPDIR"
if [ $LOGIT -eq 1 ];then
echo "$(date +"%G-%m-%d %H:%M:%S") [LOG] Created Folder: $BACKUPDIR"
fi
fi
if [ -d $BACKUPDIR2 ];then
echo -n < /dev/null
else
mkdir "$BACKUPDIR2"
if [ $LOGIT -eq 1 ];then
echo "$(date +"%G-%m-%d %H:%M:%S") [LOG] Created Folder: $BACKUPDIR2"
fi
fi
if [ -d "$FINALDIR" ];then
echo -n < /dev/null
else
mkdir "$FINALDIR"
if [ $LOGIT -eq 1 ];then
echo "$(date +"%G-%m-%d %H:%M:%S") [LOG] Created Folder: $FINALDIR"
fi
fi
if [ -d "$FINALDIR2" ];then
echo -n < /dev/null
else
mkdir "$FINALDIR2"
if [ $LOGIT -eq 1 ];then
echo "$(date +"%G-%m-%d %H:%M:%S") [LOG] Created Folder: $FINALDIR2"
fi
fi
if [ $OLDBACKUPS -lt 0 ];then
OLDBACKUPS=3
fi
if [ $LOGIT -eq 1 ];then
echo "$(date +"%G-%m-%d %H:%M:%S") [LOG] Removing backups older than $OLDBACKUPS days."
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 Removing backups older than $OLDBACKUPS days.\r"`"
fi
$OLDBACKUP
$OLDBACKUP2
if [ $NOTIFY -eq 1 ];then
screen -x $SCREENNAME -X stuff "`printf "say Old backups removed.\r"`"
fi
#######################################################################################
#
# Hier Parameter anpassen
#
#######################################################################################
WORLDS=(world world_nether world_the_end) # Namen der Welten ( = Name der Ordner)
SOURCE=/home/minecraft/minecraft/ # Verzeichnis in dem die Welten gespeichert sind
#######################################################################################
BFILE=""
for WORLD in "${WORLDS[@]}";do
BFILE="$WORLD.$STAMP.tar.gz"
if [ $LOGIT -eq 1 ];then
echo "$(date +"%G-%m-%d %H:%M:%S") [LOG] Level-Name is $WORLD"
fi
if [ $NOTIFY -eq 1 ];then
screen -x $SCREENNAME -X stuff "`printf "say Backing up $WORLD!\r"`"
fi
tar -czf $FINALDIR/$BFILE $SOURCE/$WORLD
tar -czf $FINALDIR2/$BFILE $SOURCE/$WORLD
if [ $LOGIT -eq 1 ];then
echo "$(date +"%G-%m-%d %H:%M:%S") [LOG] Packing and compressing folder: $WORLD to tar file: $FINALDIR/$BFILE"
fi
done
if [ $AUTOSAVE -eq 1 ];then
if [ $NOTIFY -eq 1 ];then
screen -x $SCREENNAME -X stuff "`printf "say Forcing Save..\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 Packing and compressing worlds...\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 Backup Completed.\r"`"
fi
;;
-* | --*)
usage
error_exit "Unknown option $1" ;;
*)
echo "Argument $1 to process..." ;;
esac
shift
done
# Main logic
graceful_exit

Danach noch ausführbar machen.

chmod +x /home/minecraft/bin/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.