Skip to content

Instantly share code, notes, and snippets.

@aergonaut
Last active August 29, 2015 14:02
Show Gist options
  • Save aergonaut/abc963d91fd7991733e9 to your computer and use it in GitHub Desktop.
Save aergonaut/abc963d91fd7991733e9 to your computer and use it in GitHub Desktop.

How to use

cd /etc/init.d
curl $RAW_GIST_URL -o minecraft
chmod a+x minecraft

Make sure to edit the script and change the configuration variables at the top to match your system.

To startup

service minecraft start

Cron

Notice that the service commands will ask for the password for your minecraft user if you are not logged in as that user. To execute operations from cron, you should edit the crontab for your minecraft user, so you don't have to enter the password.

#!/bin/bash
# /etc/init.d/minecraft
# version 0.3.2 2011-01-27 (YYYY-MM-DD)
### BEGIN INIT INFO
# Provides: minecraft
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $network
# Should-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Minecraft server
# Description: Starts the minecraft server
### END INIT INFO
# Settings start
USERNAME="minecraft"
SERVICE='ftb.jar'
MCPATH="/home/$USERNAME/minecraft"
BACKUPPATH="/home/$USERNAME/backup"
CRASHLOG_DB_PATH='<path to dump crash logs>'
JAVA_HOME="/usr"
MEMORY_OPTS="-Xmx6G -Xms6G -XX:PermSize=256m"
JAVA_OPTIONS="-XX:+UseParNewGC -XX:+UseConcMarkSweepGC"
INVOCATION="${JAVA_HOME}/bin/java -server ${MEMORY_OPTS} ${JAVA_OPTIONS} -jar $SERVICE nogui"
BACKUPARCHIVEPATH=$BACKUPPATH/archive
BACKUPDIR=$(date +%b_%Y)
# Settings end
if [ $(whoami) != $USERNAME ]; then
su $USERNAME -l -c "$(readlink -f $0) $*"
exit $?
fi
is_running() {
if [ ! -e $MCPATH/java.pid ]; then
return 1
fi
pid=$(cat $MCPATH/java.pid)
if [ -z $pid ]; then
return 1
fi
ps -eo "%p" | grep "^\\s*$pid\\s*\$" > /dev/null
return $?
}
mc_start() {
if is_running; then
echo "Tried to start but $SERVICE was already running!"
else
echo "$SERVICE was not running... starting."
echo "cd $MCPATH"
cd $MCPATH
#screen -dmS mc $INVOCATION &
echo "tmux new-session -d -s minecraft '$INVOCATION'"
tmux new-session -d -s minecraft "$INVOCATION"
for (( i=0; i < 10; i++ )); do
screenpid=$(ps -eo '%p %a' | grep -v grep | grep -i tmux | grep minecraft | awk '{print $1}')
javapid=$(ps -eo '%P %p' | grep "^\\s*$screenpid " | awk '{print $2}')
if [[ -n "$screenpid" && -n "$javapid" ]]; then
break
fi
sleep 1
done
if [[ -n "$screenpid" && -n "$javapid" ]]; then
echo "$SERVICE is now running."
echo "$javapid" > $MCPATH/java.pid
echo "minecraft" > $MCPATH/screen.name
else
echo "Could not start $SERVICE."
fi
fi
}
mc_startmonitor() {
if [ -z $CHECKSERVER ]; then
echo "started monitor"
/usr/bin/daemon --name=minecraft_checkserver -- $JAVA_HOME/bin/java -cp $CHECKSERVER CheckServer localhost $PORT
fi
}
mc_saveoff() {
if is_running; then
echo "$SERVICE is running... suspending saves"
mc_exec "say SERVER BACKUP STARTING. Server going readonly..."
mc_exec "save-off"
mc_exec "save-all"
sync
sleep 10
else
echo "$SERVICE was not running. Not suspending saves."
fi
}
mc_saveon() {
if is_running; then
echo "$SERVICE is running... re-enabling saves"
mc_exec "save-on"
mc_exec "say SERVER BACKUP ENDED. Server going read-write..."
else
echo "$SERVICE was not running. Not resuming saves."
fi
}
mc_kill() {
pid=$(cat $MCPATH/java.pid)
echo "terminating process with pid $pid"
kill $pid
for (( i=0; i < 10; i++ )); do
is_running || break
sleep 1
done
if is_running; then
echo "$SERVICE could not be terminated, killing..."
kill -SIGKILL $pid
echo "$SERVICE killed"
else
echo "$SERVICE terminated"
fi
}
mc_stop() {
if is_running; then
echo "$SERVICE is running... stopping."
mc_exec "say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map..."
mc_exec "save-all"
sleep 10
mc_exec "stop"
for (( i=0; i < 20; i++ )); do
is_running || break
sleep 1
done
else
echo "$SERVICE was not running."
fi
if is_running; then
echo "$SERVICE could not be shut down cleanly... still running."
mc_kill
else
echo "$SERVICE is shut down."
fi
rm $MCPATH/java.pid
rm $MCPATH/screen.name
}
mc_stopmonitor() {
if [ -z $CHECKSERVER ]; then
/usr/bin/daemon --name=minecraft_checkserver --stop
fi
}
mc_backup() {
echo "Backing up minecraft world"
[ -d "$BACKUPPATH/$BACKUPDIR" ] || mkdir -p "$BACKUPPATH/$BACKUPDIR"
rdiff-backup $MCPATH "$BACKUPPATH/$BACKUPDIR"
echo "Backup complete"
}
mc_thinoutbackup() {
if (($(date +%H) == 0)) && (($(date +%M) < 15)); then
archivedate=$(date --date="7 days ago")
echo "Thinning backups created $archivedate out"
archivedateunix=$(date --date="$archivedate" +%s)
archivesourcedir=$BACKUPPATH/$(date --date="$archivedate" +%b_%Y)
archivesource=$archivesourcedir/rdiff-backup-data/increments.$(date --date="$archivedate" +%Y-%m-%dT%H):0*.dir
archivesource=$(echo $archivesource)
archivedest=$BACKUPARCHIVEPATH/$(date --date="$archivedate" +%b_%Y)
if [[ ! -f $archivesource ]]; then
echo "Nothing to be done"
else
tempdir=$(mktemp -d)
if [[ ! $tempdir =~ ^/tmp ]]; then
echo "invalid tmp dir $tempdir"
else
rdiff-backup $archivesource $tempdir
rdiff-backup --current-time $archivedateunix $tempdir $archivedest
rm -R "$tempdir"
rdiff-backup --remove-older-than 7D --force $archivesourcedir
echo "done"
fi
fi
fi
}
mc_exec() {
if is_running; then
#screen -p 0 -S $(cat $MCPATH/screen.name) -X stuff "$@$(printf \\r)"
tmux send-keys -t $(cat $MCPATH/screen.name) "$@" Enter
else
echo "$SERVICE was not running. Not executing command."
fi
}
mc_dumpcrashlogs() {
if is_running; then
cp $MCPATH/crash-reports/* $CRASHLOG_DB_PATH
mv $MCPATH/crash-reports/* $MCPATH/crash-reports.archive/
fi
}
#Start-Stop here
case "$1" in
start)
mc_start
;;
stop)
#mc_stopmonitor
mc_stop
;;
restart)
mc_stop
mc_start
;;
backup)
mc_saveoff
mc_backup
mc_saveon
mc_thinoutbackup
;;
exec)
shift
mc_exec "$@"
;;
dumpcrashlogs)
mc_dumpcrashlogs
;;
status)
if is_running
then
echo "$SERVICE is running."
else
echo "$SERVICE is not running."
fi
;;
*)
echo "Usage: $(readlink -f $0) {start|stop|restart|backup|exec|dumpcrashlogs|status}"
exit 1
;;
esac
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment