Minecraft backup, update, and startup script

I wish I could attribute this to someone, but forgot where I downloaded it. If you know the page where this script came from, please post a comment.


#!/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
SERVICE='craftbukkit.jar'
USERNAME="minecraft"
MCPATH='/home/minecraft/bukkit'
CPU_COUNT=1
INVOCATION="java -Xmx1024M -Xms1024M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=$CPU_COUNT -XX:+AggressiveOpts -jar craftbukkit.jar nogui"
BACKUPPATH='/home/minecraft/archive'

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"
}

#Start-Stop here
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
;;

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

exit 0

Linux commands to use with your Minecraft server on a VPS

Log in using PutTy

You need to change directories to get to your minecraft directory.  For example,

cd minecraft/bukkit

If you’re having trouble, you may be in the wrong directory. So, type

cd

and it will return you to your home directory. From there, you can do

cd minecraft/bukkit

To start the minecraft server, run the script:

sh minecraft.sh

or

sh craftbukkit.sh

This will switch the “screen” over to the minecraft server screen output.
In this window, you can simply type

stop

Sometimes, your PutTy session will freeze, but your minecraft server is still running.  This is because of “screen”.

Screen is a program that allows multiple processes to be running.  You have to recapture your lost screen.  This is sort of like when you use Alt-Tab in Windows.

See the explanation here on how to switch screen sessions.

Basically, you can do

screen -r

and it should return the session

Check if the port is open

You might need to check if the port is open. Use this site: http://ping.eu/port-chk/ I think it will only work if the minecraft server is running. So, make sure it is running before you check it on that page. Put in the IP address – the 173.xxx.xxx.xx one, not the one it populates by default.

Add the port to TCP_IN in whm under the firewall configurations:

port

Minecraft backup

To make a backup of your stuff, move up a directory:

cd ..

This should put you in the minecraft directory.
You can make a copy of the whole thing by typing

 cp -R bukkit bukkit2

You can use different names to keep different versions. In this case, your backup is bukkit2.
If you mess something up, you need to delete (remove) your bukkit directory and then copy your backup to the bukkit directory. You should probably stop your minecraft server first with the stop command.

rm -rf bukkit
cp -R bukkit2 bukkit

In this case, we copied bukkit2 to bukkit. (bukkit2 was considered your “backup” and bukkit is your main/working server directory)

Where to get the latest Craftbukkit release

To get the latest stable release, you would use the command:

wget 'http://dl.bukkit.org/latest-rb/craftbukkit.jar'

However, that will download a file with a name like craftbukkit-1.2.4-R1.0.jar

So, instead use this commannd:

wget 'http://dl.bukkit.org/latest-rb/craftbukkit.jar -O craftbukkit.jar'

This will automatically name your local file “craftbukkit.jar”

To keep up with the latest development, you can download the latest releases here: http://dl.bukkit.org/downloads/craftbukkit/