Starte den MC-Server in einer screen-Session. tmux geht auch, wenn dir das lieber ist.
Ich hab grad mal meine alten Scripte raus gesucht. Bedenke aber, dass ich die seit Jahren nicht mehr benutzt habe.
startscreensession.sh
Code:
#!/bin/bash
script -c "screen -S minecraft $1" /dev/null
minecraftserver.sh
Code:
#!/bin/bash
exitstatus=0
#Error-Funktion:
function error_exit {
echo $1 >&2
exit $2
}
function error_status {
echo $1 >&2
exitstatus=$2
}
# Arbeitsverzeichnis wechseln
cd ~/server/
#Backup der Welt anlegen
. ~/bin/backupworld.sh initial
#Config laden
echo '===================='
echo 'Lade Config'
echo '===================='
. $HOME/bin/servercomunication.cfg
#FiFos anlegen
echo '===================='
echo 'Erzeuge FiFos'
echo '===================='
mkfifo $inputfifo || error_exit "Fehler beim anlegen des Input-FiFo" 1
mkfifo $outputfifo || error_exit "Fehler beim anlegen des Output-FiFo" 1
#Server starten
echo '===================='
echo 'Starte Server'
echo '===================='
tail -f $inputfifo | java -Xmx1536M -Xms1536M -jar minecraft_server.jar nogui
echo '===================='
echo 'Server gestoppt'
echo '===================='
#FiFos löschen
echo '===================='
echo 'Entferne FiFos'
echo '===================='
rm $outputfifo || exit_status "Fehler beim löschen des output-FiFo" 1
rm $inputfifo || exit_status "Fehler beim löschen des Input-FiFo" 1
exit $exitstatus
backupworld.sh
Code:
#!/bin/bash
. $HOME/bin/servercomunication.cfg
#Arbeitsverzeichnis wechseln
cd ~/server/
#Wenn Backup in laufendem Betrieb /save-all und /save-off ausführen
if [ "$1" != "initial" ]; then
echo "/say [Backup] Starte Backup" > $inputfifo
logfilesize=`wc -l $serverlogfile | cut -f 1 -d " "`
logfilesize=`echo "+$logfilesize"`
foundresponse=1
echo "/save-all" > $inputfifo
for i in {1..100}; do
tail -n $logfilesize $serverlogfile | grep '\[Server thread\/INFO\]\: Saved the world' > /dev/null
if [ $? -eq 0 ]; then
foundresponse=0
break
fi
sleep 1
done
if [ $foundresponse -gt 0 ]; then
echo "Command didn't reach server /save-all" >&2
exit 2
fi
foundresponse=2
logfilesize=`wc -l $serverlogfile | cut -f 1 -d " "`
logfilesize=`echo "+$logfilesize"`
echo "/save-off" > $inputfifo
for j in {1..100}; do
tail -n $logfilesize $serverlogfile | grep '\[Server thread\/INFO\]\: Turned off world auto-saving' > /dev/null
if [ $? -eq 0 ]; then
foundresponse=0
break
fi
sleep 1
done
if [ $foundresponse -gt 0 ]; then
echo "Command didn't reach server /save-off" >§2
exit 3
fi
fi
#Backup der Welt erstellen
echo '===================='
echo 'Erstelle Backup'
echo '===================='
BACKUPDATE=`date +%d.%m.%Y-%H:%M`
tar cfvz ./srv_worldbackup/$BACKUPDATE.tar.gz world
echo '===================='
echo 'Backup vollständig'
echo '===================='
#Wenn Backup im laufenden Betrieb /save-on ausführen
if [ "$1" != "initial" ]; then
logfilesize=`wc -l $serverlogfile | cut -f 1 -d " "`
logfilesize=`echo "+$logfilesize"`
foundresponse=3
echo "/save-on" > $inputfifo
for k in {1..100}; do
tail -n $logfilesize $serverlogfile | grep '\[Server thread\/INFO\]\: Turned on world auto-saving' > /dev/null
if [ $? -eq 0 ]; then
foundresponse=0
break
fi
sleep 1
done
if [ $foundresponse -gt 0 ]; then
echo "Command didn't reach server /save-on" >§2
exit 4
fi
echo "/say [Backup] Backup abgeschlossen" > $inputfifo
exit 0
fi
servercomunication.cfg
Code:
## Konfigurations-Datei für Kommunikation mit MineCraft-Server über FiFo
## Input-FiFo um Text an Server zu senden
inputfifo="$HOME/server/serverinput.fifo"
## Output-FiFo um den Output vom Server lesen zu können
outputfifo="$HOME/server/serveroutput.fifo"
## Pfad zum Server-Logfile
serverlogfile="$HOME/server/logs/latest.log"
## Default Wartezeit bis Server runter fährt
servershutdowntime=20
servercommand.sh
Code:
#!/bin/bash
. $HOME/bin/servercomunication.cfg
echo "/$*" > $inputfifo
exit 0
servermsg.sh
Code:
#!/bin/bash
. $HOME/bin/servercomunication.cfg
echo "/say $*" > $inputfifo
exit 0
serverstop.sh
Code:
#!/bin/bash
. $HOME/bin/servercomunication.cfg
if [ "$1" == "now" ]; then
servershutdowntime=0
fi
if [ "$1" == "-t" ] && [[ "$2" =~ ^[0-9]+$ ]] ; then
servershutdowntime=$2
fi
if [ $servershutdowntime -gt 10 ]; then
shutdowntime=$(($servershutdowntime / 2))
/bin/echo "/say Server fährt in $servershutdowntime Sekunden runter." > $inputfifo
/bin/sleep $shutdowntime
while [ $shutdowntime -gt 1 ];
do
/bin/echo "/say Server fährt in $shutdowntime Sekunden runter." > $inputfifo
#/bin/sleep $shutdowntime
steptime=$(($shutdowntime / 2))
shutdowntime=$(($shutdowntime - $steptime))
/bin/sleep $shutdowntime
done
/bin/sleep 1
else
/bin/sleep $servershutdowntime
fi
/bin/echo "/say Server fährt jetzt runter." > $inputfifo
/bin/sleep 1
/bin/echo "/stop" > $inputfifo
inputTailPid=`/usr/bin/lsof -F p $inputfifo | cut -d "p" -f 2`
for i in {0..100}; do
/usr/bin/lsof -F p $HOME/server/minecraft_server.jar > /dev/null
if [ $? != 0 ]; then
/bin/kill -s SIGKILL `/bin/echo $inputTailPid`
exit 0
fi
sleep 1
done
/bin/echo "Error shutting down Server."
/bin/kill -s SIGKILL `/bin/echo $inputTailPid`
exit 1
resumescreensession.sh
Code:
#!/bin/bash
script -c 'screen -dr minecraft' /dev/null