r15ch13
1/11/2015 - 12:17 AM

init.d script for bukkit

init.d script for bukkit

#!/bin/bash
# /etc/init.d/minecraft
# version 0.3.6 2011-10-17 (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
UPDATE_SLUG='beta' #rb beta dev
SERVICE="craftbukkit-$UPDATE_SLUG.jar"
OPTIONS='nogui'
USERNAME='minecraft'
WORLD='world'
MCPATH='/home/minecraft/minecraft'
BACKUPPATH='/home/minecraft/backup'
COMPLETE_BACKUP_EXCLUDE={plugins/dynmap/web/tiles,logs,crash-reports,'*.log'}
#CPU_COUNT=8
#INVOCATION=" /usr/bin/java -Xmx4096M -Xms512M -server -jar $SERVICE $OPTIONS"
INVOCATION=" /usr/bin/java -XX:ParallelGCThreads=8 -Xmx2048M -Xms512M -server -jar $SERVICE $OPTIONS"
#INVOCATION="java -Xmx4096M -Xms512M -server -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=$CPU_COUNT -XX:+AggressiveOpts -jar $SERVICE $OPTIONS"
#INVOCATION="java -Xmx4096M -XX:ParallelGCThreads=8 -server -Xincgc -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSIncrementalPacing -XX:+AggressiveOpts -XX:+CMSParallelRemarkEnabled -XX:+DisableExplicitGC -XX:MaxGCPauseMillis=500 -XX:SurvivorRatio=16 -XX:TargetSurvivorRatio=90 -XX:+UseAdaptiveGCBoundary -XX:-UseGCOverheadLimit -Xnoclassgc -XX:UseSSE=3 -XX:PermSize=128m -XX:LargePageSizeInBytes=4m -jar $SERVICE $OPTIONS"
SCREEN='minecraft-bukkit'

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

mc_start() {
  if  pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is already running!"
  else
    echo "Starting $SERVICE..."
    cd $MCPATH
    as_user "cd $MCPATH && echo > $MCPATH/server.log"
    as_user "cd $MCPATH && screen -dmS '$SCREEN' $INVOCATION"
    sleep 7
    if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
      echo "$SERVICE is now running."
    else
      echo "Error! Could not start $SERVICE!"
    fi
  fi
}

mc_saveoff() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running... suspending saves"
    as_user "screen -p 0 -S '$SCREEN' -X eval 'stuff \"say SERVER BACKUP STARTING. Server going readonly...\"\015'"
    as_user "screen -p 0 -S '$SCREEN' -X eval 'stuff \"save-off\"\015'"
    as_user "screen -p 0 -S '$SCREEN' -X eval 'stuff \"save-all\"\015'"
    sync
    sleep 10
  else
    echo "$SERVICE is not running. Not suspending saves."
  fi
}

mc_saveon() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running... re-enabling saves"
    as_user "screen -p 0 -S '$SCREEN' -X eval 'stuff \"save-on\"\015'"
    as_user "screen -p 0 -S '$SCREEN' -X eval 'stuff \"say SERVER BACKUP ENDED. Server going read-write...\"\015'"
  else
    echo "$SERVICE is not running. Not resuming saves."
  fi
}

mc_stop() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "Stopping $SERVICE"
    as_user "screen -p 0 -S '$SCREEN' -X eval 'stuff \"say SERVER SHUTTING DOWN IN 15 SECONDS. Saving map...\"\015'"
    as_user "screen -p 0 -S '$SCREEN' -X eval 'stuff \"save-all\"\015'"
    sleep 15
    as_user "screen -p 0 -S '$SCREEN' -X eval 'stuff \"stop\"\015'"
    sleep 10
  else
    echo "$SERVICE was not running."
  fi
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "Error! $SERVICE could not be stopped."
  else
    echo "$SERVICE is stopped."
  fi
}

mc_update() {
  case "$UPDATE_SLUG" in
    rb)
      MC_SERVER_URL='http://dl.bukkit.org/latest-rb/craftbukkit.jar'
      MC_OUTPUT='craftbukkit-rb.jar'
    ;;
    beta)
      MC_SERVER_URL='http://dl.bukkit.org/latest-beta/craftbukkit.jar'
      MC_OUTPUT='craftbukkit-beta.jar'
    ;;
    dev)
      MC_SERVER_URL='http://dl.bukkit.org/latest-dev/craftbukkit.jar'
      MC_OUTPUT='craftbukkit-dev.jar'
    ;;
    *)
      MC_SERVER_URL='http://dl.bukkit.org/latest-rb/craftbukkit.jar'
      MC_OUTPUT='craftbukkit.jar'
    ;;
  esac
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running! Will not start update."
  else
    as_user "cd $MCPATH && wget -q -O $MCPATH/$MC_OUTPUT.update $MC_SERVER_URL"
    if [ -f "$MCPATH/$MC_OUTPUT.update" ]
    then
      if `diff $MCPATH/$MC_OUTPUT $MCPATH/$MC_OUTPUT.update >/dev/null`
      then
        echo "You are already running the latest version of $MC_OUTPUT."
      else
        as_user "mv $MCPATH/$MC_OUTPUT.update $MCPATH/$MC_OUTPUT"
        echo "Minecraft successfully updated."
      fi
    else
      echo "Minecraft update could not be downloaded."
    fi
  fi
}

mc_backup() {
  echo "Backing up minecraft world..."
  if [ -f "$BACKUPPATH/${WORLD}_`date "+%Y.%m.%d_%H.%M"`.tar.gz" ]
  then
    for i in 1 2 3 4 5 6
    do
      if [ -f "$BACKUPPATH/${WORLD}_`date "+%Y.%m.%d_%H.%M"`-$i.tar.gz" ]
      then
        continue
      else
        as_user "cd $MCPATH && tar -zcf $BACKUPPATH/${WORLD}_`date "+%Y.%m.%d_%H.%M"`-$i.tar.gz ${WORLD}"
        as_user "cd $MCPATH && tar -zcf $BACKUPPATH/${WORLD}_nether_`date "+%Y.%m.%d_%H.%M"`-$i.tar.gz ${WORLD}_nether"
        as_user "cd $MCPATH && tar -zcf $BACKUPPATH/${WORLD}_the_end_`date "+%Y.%m.%d_%H.%M"`-$i.tar.gz ${WORLD}_the_end"
        break
      fi
    done
  else
    as_user "cd $MCPATH && tar -zcf $BACKUPPATH/${WORLD}_`date "+%Y.%m.%d_%H.%M"`.tar.gz ${WORLD}"
    as_user "cd $MCPATH && tar -zcf $BACKUPPATH/${WORLD}_nether_`date "+%Y.%m.%d_%H.%M"`.tar.gz ${WORLD}_nether"
    as_user "cd $MCPATH && tar -zcf $BACKUPPATH/${WORLD}_the_end_`date "+%Y.%m.%d_%H.%M"`.tar.gz ${WORLD}_the_end"
    echo "Backed up world"
  fi

  echo "Backing up settings"
  as_user "cd $MCPATH && git add ."
  as_user "cd $MCPATH && git commit -m 'Backup `date "+%Y.%m.%d_%H.%M"`'"
  as_user "cd $MCPATH && git push origin master"

  echo "Backing up $SERVICE"
  if [ -f "$BACKUPPATH/minecraft_server_`date "+%Y.%m.%d_%H.%M"`.jar" ]
  then
    for i in 1 2 3 4 5 6
    do
      if [ -f "$BACKUPPATH/minecraft_server_`date "+%Y.%m.%d_%H.%M"`-$i.jar" ]
      then
        continue
      else
        as_user "cd $MCPATH && cp $SERVICE \"$BACKUPPATH/minecraft_server_`date "+%Y.%m.%d_%H.%M"`-$i.jar\""
        break
      fi
    done
  else
    as_user "cd $MCPATH && cp $SERVICE \"$BACKUPPATH/minecraft_server_`date "+%Y.%m.%d_%H.%M"`.jar\""
  fi
  echo "Backup complete"
  echo "Deleting backups older than 30 days"
  find $BACKUPPATH/*.jar -mtime +30 -exec rm {} \;
  find $BACKUPPATH/world*.tar.gz -mtime +30 -exec rm {} \;
}

mc_complete_backup() {
  echo "Backing up minecraft server..."
  if [ -f "$BACKUPPATH/complete-backup/LoVo-Minecraft-`date "+%Y.%m.%d_%H.%M"`.tar.gz" ]
  then
    for i in 1 2 3 4 5 6
    do
      if [ -f "$BACKUPPATH/complete-backup/LoVo-Minecraft-`date "+%Y.%m.%d_%H.%M"`-$i.tar.gz" ]
      then
        continue
      else
        as_user "cd $MCPATH && tar -zcf $BACKUPPATH/complete-backup/LoVo-Minecraft-`date "+%Y.%m.%d_%H.%M"`-$i.tar.gz --exclude-vcs --exclude=$COMPLETE_BACKUP_EXCLUDE ."
        break
      fi
    done
  else
    as_user "cd $MCPATH && tar -zcf $BACKUPPATH/complete-backup/LoVo-Minecraft-`date "+%Y.%m.%d_%H.%M"`.tar.gz --exclude-vcs --exclude=$COMPLETE_BACKUP_EXCLUDE ."
    echo "Backed up complete minecraft server"
  fi
  echo "Backup complete"
  echo "Deleting backups older than 2 days"
  find $BACKUPPATH/complete-backup/*.tar.gz -mtime +2 -exec rm {} \;
}

mc_command() {
  command="$1";
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    pre_log_len=`wc -l "$MCPATH/server.log" | awk '{print $1}'`
    echo "$SERVICE is running... executing command"
    as_user "screen -p 0 -S '$SCREEN' -X eval 'stuff \"$command\"\015'"
    sleep .1 # assumes that the command will run and print to the log file in less than .1 seconds
    # print output
    tail -n $[`wc -l "$MCPATH/server.log" | awk '{print $1}'`-$pre_log_len] "$MCPATH/server.log"
  fi
}

#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
    ;;
  complete-backup)
    mc_stop
    mc_complete_backup
    mc_start
    ;;
  status)
    if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
      echo "$SERVICE is running."
    else
      echo "$SERVICE is not running."
    fi
    ;;
  command)
    if [ $# -gt 1 ]; then
      shift
      mc_command "$*"
    else
      echo "Must specify server command (try 'help'?)"
    fi
    ;;

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

exit 0