#!/bin/bash # /etc/init.d/minecraft # version 0.9 (Sasquatch) 2016-04-29 (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 RAMDISK Server # Description: Starts the minecraft server via ramdisk ### END INIT INFO # SERVER SETTINGS JARFILE="spigot.jar" USERNAME="minecraft" MCSTORE="/home/$USERNAME/server_store" MCPATH="/home/$USERNAME/ramdisk" BACKUPPATH="/home/$USERNAME/backups/" WORLD='world' # Machine Settings CPU_COUNT=8 MAX_RAM=8048 START_RAM=2048 # JAVA INVOCATION INVOCATION="java -Xmx${MAX_RAM}M -Xms${START_RAM}M -server -jar $JARFILE -o false" # COLOR CODES NOR="\e[0m" BOL="\e[1m" GRE="\e[32m" RED="\e[31m" YEL="\e[33m" # ERRORS LAST_BACK="${RED}${BOL}Last $WORLD.bak still exists!${NOR} The server may have crashed. ${YEL}Please check logs.${NOR}\n" check_java() { if ! hash java 2>/dev/null; then return 1 else return 0 fi } check_ramdisk() { if ! df -h | grep -q $MCPATH ; then return 1 else return 0 fi } as_user() { if [ "`whoami`" == "$USERNAME" ] ; then bash -c "$1" else su - $USERNAME -c "$1" fi } mc_status() { ps aux |grep -F -v grep|grep -F -v SCREEN|grep -F --quiet $JARFILE return $? } mc_start() { if check_java ; then if mc_status ; then echo -e "${YEL}Tried to start but $JARFILE was already running!${NOR}" else #if ! df -h | grep -q $MCPATH ; then # echo -e "${YEL}Starting RAMDISK...${NOR}\n" # start_ramdisk #fi echo -e "${YEL}Starting ${JARFILE}...${NOR}" if [ -d $MCSTORE/$WORLD.bak ]; then echo -e $LAST_BACK exit 1 fi cd $MCPATH if [ ! -f "$MCPATH/$JARFILE" ]; then echo -e "${YEL}RAMDISK is empty... prepping.${NOR}" as_user "cp -R $MCSTORE/* $MCPATH/" fi as_user "cd $MCPATH && screen -dmS minecraft $INVOCATION" sleep 7 if mc_status; then echo -e "${GRE}${JARFILE} is now running.${NOR}" else echo -e "${RED}${BOL}Could not start $JARFILE.${NOR}" fi fi else exit 1 fi } mc_saveoff() { if mc_status; then echo -e "${YEL}${JARFILE} is running... suspending saves.${NOR}" TO_SCREEN="screen -p 0 -S minecraft -X eval 'stuff " as_user "$TO_SCREEN \"say SERVER BACKUP STARTING. Server going readonly...\"\015'" as_user "$TO_SCREEN \"save-off\"\015'" as_user "$TO_SCREEN \"save-all\"\015'" sync sleep 10 else echo -e "${RED}${BOL}${JARFILE} was not running.${NOR} ${YEL}Not suspending saves.${NOR}" fi } mc_saveon() { if mc_status; then echo -e "${YEL}$JARFILE is running... re-enabling saves${NOR}" TO_SCREEN="screen -p 0 -S minecraft -X eval 'stuff " as_user "$TO_SCREEN \"save-on\"\015'" as_user "$TO_SCREEN \"say SERVER BACKUP ENDED. Server going read-write...\"\015'" else echo -e "${RED}${BOL}${JARFILE} was not running.${NOR} ${YEL}Not resuming saves.${NOR}" fi } mc_stop() { if mc_status; then echo -e "${YEL}${JARFILE} is running... stopping.${NOR}" TO_SCREEN="screen -p 0 -S minecraft -X eval 'stuff " as_user "$TO_SCREEN \"say SERVER SHUTTING DOWN IN 5 SECONDS. Saving map...\"\015'" as_user "$TO_SCREEN \"save-all\"\015'" sleep 5 as_user "$TO_SCREEN \"stop\"\015'" sleep 5 else echo -e "${RED}${JARFILE} was not running.${NOR}" fi if mc_status; then echo -e "${RED}{$BOL}${JARFILE} could not be shut down... still running.${NOR}" else echo -e "${GRE}$JARFILE is stopped.${NOR}" fi } mc_update() { if mc_status; then echo -e "${RED}${BOL}${JARFILE} is running!{$NOR} ${YEL}Will not start update.${NOR}" 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/$JARFILE $MCPATH/minecraft_server.jar.update >/dev/null` then echo -e "${YEL}You are already running the latest version of ${BOL}${JARFILE}${NOR}${YEL}.${NOR}" rm $MCPATH/minecraft_server.jar.update >/dev/null else as_user "mv $MCPATH/minecraft_server.jar.update $MCPATH/$JARFILE" echo -e "${GRE}${BOL}Minecraft successfully updated.${NOR}" fi else echo -e "${RED}${BOL}Minecraft update could not be downloaded.${NOR}" fi fi } mc_backup() { echo -e "${YEL}Backing up minecraft files...${NOR}" as_user "tar zcf $BACKUPPATH/MCBKUP_`date "+%Y.%m.%d-%H"`.tar.gz $MCSTORE" echo -e "${GRE}Backup complete!${NOR}" } mc_rdsave() { if mc_status; then echo -e "${YEL}Saving RAMDISK...${NOR}" if [ ! -f $MCPATH/$JARFILE ]; then echo -e "${RED}${BOL}Error: Minecraft not in RAMDISK${NOR}" else if [ -d $MCSTORE/$WORLD.bak ]; then echo -e $LAST_BACK exit 1 fi if [ -d $MCSTORE/$WORLD ]; then as_user "mv $MCSTORE/$WORLD $MCSTORE/$WORLD.bak" fi TO_SCREEN="screen -p 0 -S minecraft -X eval 'stuff " as_user "$TO_SCREEN \"save-off\"\015'" as_user "$TO_SCREEN \"save-all\"\015'" as_user "cp -R $MCPATH/* $MCSTORE/" as_user "$TO_SCREEN \"save-on\"\015'" if [ -d $MCSTORE/$WORLD.bak ]; then as_user "rm -r $MCSTORE/$WORLD.bak" fi fi else echo -e "${RED}Service is not running.${NOR}" fi } mc_rdhalt() { echo -e "${YEL}Saving RAMDISK...${NOR}" if [ ! -f $MCPATH/$JARFILE ]; then echo -e "${RED}${BOL}Error: Minecraft not in RAMDISK${NOR}" else if [ -d $MCSTORE/$WORLD.bak ]; then echo -e $LAST_BACK exit 1 fi if [ -d $MCSTORE/$WORLD ]; then as_user "mv $MCSTORE/$WORLD $MCSTORE/$WORLD.bak" fi echo -e "${GRE}Saved.${NOR} Screen session closed." as_user "cp -R $MCPATH/* $MCSTORE/" as_user "rm -rf $MCPATH/*" if [ -d $MCSTORE/$WORLD.bak ]; then as_user "rm -r $MCSTORE/$WORLD.bak" fi fi } #Start-Stop here case "$1" in cjava) if check_java ; then echo -e "${BOL}Oracle Java 7${NOR} or higher is required to run Minecraft Server. (Oracle Java 8 Recommended)\n" else echo -e "${GRE}Java is installed!${NOR}" fi ;; cramdisk) if check_ramdisk ; then echo -e "${BOL}${RED}RAMDISK is offline!${NOR}\n" else echo -e "${GRE}RAMDISK is online.${NOR}" fi ;; start) check_java mc_start ;; stop) mc_stop mc_rdhalt ;; restart) mc_stop mc_rdhalt mc_start ;; update) mc_stop mc_backup mc_update mc_start ;; backup) mc_rdsave mc_saveoff mc_backup mc_saveon ;; disksavehalt) mc_rdhalt ;; disksaverun) mc_rdsave ;; status) if mc_status; then echo -e "${GRE}${JARFILE} is running.${NOR}" else echo -e "${RED}${JARFILE} is not running.${NOR}" fi ;; cmd) TO_SCREEN="screen -p 0 -S minecraft -X eval 'stuff " as_user "$TO_SCREEN \"${2}\"\015'" sleep .5 awk '/./{line=$0} END{print line}' ${MCPATH}/logs/latest.log ;; *) echo "Usage: /etc/init.d/minecraft {start|stop|restart|cmd|update|backup|status|cramdisk|cjava|disksaverun}" exit 1 ;; esac