Tutorials/Server startup script

This is an example of possible Minecraft server startup and maintenance script for Linux distros.

Script

 * 1) !/bin/bash
 * 2) /etc/init.d/minecraft
 * 3) version 0.3.2 2011-01-27 (YYYY-MM-DD)


 * 1) BEGIN INIT INFO
 * 2) Provides:   minecraft
 * 3) Required-Start: $local_fs $remote_fs
 * 4) Required-Stop:  $local_fs $remote_fs
 * 5) Should-Start:   $network
 * 6) Should-Stop:    $network
 * 7) Default-Start:  2 3 4 5
 * 8) Default-Stop:   0 1 6
 * 9) Short-Description:    Minecraft server
 * 10) Description:    Starts the minecraft server
 * 11) END INIT INFO

SERVICE='minecraft_server.jar' USERNAME="minecraft" MCPATH='/home/minecraft/minecraft' CPU_COUNT=1 INVOCATION='java -Xmx1024M -Xms1024M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=$CPU_COUNT -XX:+AggressiveOpts -jar minecraft_server.jar nogui' BACKUPPATH='/media/remote.share/minecraft.backup'
 * 1) Settings

ME=`whoami` as_user { if [ "$ME" == "$USERNAME" ] ; then bash -c "$1" else su - $USERNAME -c "$1" fi }

mc_start { if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null then echo "Tried to start but $SERVICE was already running!" else echo "$SERVICE was not running... starting." cd $MCPATH as_user "cd $MCPATH && screen -dmS minecraft $INVOCATION" sleep 7 if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null then echo "$SERVICE is now running." else echo "Could not start $SERVICE." fi fi }

mc_saveoff { if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null then echo "$SERVICE is running... suspending saves" as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP STARTING. Server going readonly...\"\015'" as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-off\"\015'" as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'" sync sleep 10 else echo "$SERVICE was not running. Not suspending saves." fi }

mc_saveon { if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null then echo "$SERVICE is running... re-enabling saves" as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-on\"\015'" as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP ENDED. Server going read-write...\"\015'" else echo "$SERVICE was not running. Not resuming saves." fi }

mc_stop { if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null then echo "$SERVICE is running... stopping." as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map...\"\015'" as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'" sleep 10 as_user "screen -p 0 -S minecraft -X eval 'stuff \"stop\"\015'" sleep 7 else echo "$SERVICE was not running." fi       if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null then echo "$SERVICE could not be shut down... still running." else echo "$SERVICE is shut down." fi }

mc_update { if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null then echo "$SERVICE is running! Will not start update." else MC_SERVER_URL=http://minecraft.net/`wget -q -O - http://www.minecraft.net/download.jsp | grep minecraft_server.jar\ | cut -d \" -f 2`   as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update $MC_SERVER_URL"    if [ -f $MCPATH/minecraft_server.jar.update ]    then      if `diff $MCPATH/minecraft_server.jar $MCPATH/minecraft_server.jar.update >/dev/null`        then           echo "You are already running the latest version of $SERVICE."        else          as_user "mv $MCPATH/minecraft_server.jar.update $MCPATH/minecraft_server.jar"          echo "Minecraft successfully updated."      fi    else      echo "Minecraft update could not be downloaded."    fi  fi }

mc_backup { echo "Backing up minecraft world" if [ -d $BACKUPPATH/world_`date "+%Y.%m.%d"` ] then for i in 1 2 3 4 5 6 do      if [ -d $BACKUPPATH/world_`date "+%Y.%m.%d"`-$i ] then continue else as_user "cd $MCPATH && cp -r world $BACKUPPATH/world_`date "+%Y.%m.%d"`-$i" break fi    done else as_user "cd $MCPATH && cp -r world $BACKUPPATH/world_`date "+%Y.%m.%d"`" echo "Backed up world" fi  echo "Backing up the minecraft server executable" if [ -f "$BACKUPPATH/minecraft_server_`date "+%Y.%m.%d"`.jar" ] then for i in 1 2 3 4 5 6 do      if [ -f "$BACKUPPATH/minecraft_server_`date "+%Y.%m.%d"`-$i.jar" ] then continue else as_user "cd $MCPATH && cp minecraft_server.jar \"$BACKUPPATH/minecraft_server_`date "+%Y.%m.%d"`-$i.jar\"" break fi    done else as_user "cd $MCPATH && cp minecraft_server.jar \"$BACKUPPATH/minecraft_server_`date "+%Y.%m.%d"`.jar\"" fi  echo "Backup complete" }

case "$1" in start)    mc_start    ;;  stop) mc_stop ;; restart)    mc_stop    mc_start    ;;  update) mc_stop mc_backup mc_update mc_start ;; backup)    mc_saveoff    mc_backup    mc_saveon    ;;  status) if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null then echo "$SERVICE is running." else echo "$SERVICE is not running." fi   ;;
 * 1) Start-Stop here

*) echo "Usage: /etc/init.d/minecraft {start|stop|update|backup|status|restart}"  exit 1  ;; esac

exit 0

Requirements

 * screen

Installation
Use your favorite editor to create file called minecraft in /etc/init.d/ and paste the script above in that file.

Edit the USERNAME and MCPATH -variables according to your setup. If you use a wrapper script, change INVOCATION to start it instead of starting the server directly.

Make sure the newly created file has required permissions You can set the permissions by running: chmod 755 /etc/init.d/minecraft

Then run (on debian based distros) update-rc.d minecraft defaults to add required symbolic links. Note: your system will most likely warn you that the script does not meet all requirements. The script will however work.

You can also setup an entry in your crontab to backup the server with: /etc/init.d/minecraft backup

Uninstall
(In debian based linux distro) update-rc.d -f minecraft remove

Usage
/etc/init.d/minecraft start stop, restart, backup or update