Created
January 11, 2015 00:17
-
-
Save r15ch13/2ec8303ff51087093bf8 to your computer and use it in GitHub Desktop.
init.d script for bukkit
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment