#!/usr/bin/bash # Source from http://minecraft.gamepedia.com/Tutorials/Server_startup_script # Made changes to suit my needs, now serves as a proper croncheck script # There will be bugs. Fix them. Send me a note about it if you like and # I'll include them. I can be reached on reddit as /u/jbranscum # This is open source. Don't be a jerk. Give credit where it is due if you # decide to modify this script as I have done # # Replace HOMEDIR, MCUSERNAME, MCSERVERDIR as needed. # Cron entry should look like so: # */5 * * * * /home/HOMEDIR/scripts/mcinit croncheck # 30 04 * * * /home/HOMEDIR/scripts/mcinit restart # # You need screen, uuencode and mailx for this script in addition to standard bash tools (pgrep, etc) # I cannot provide support on this. Use at your own risk. You have been warned. # # If you're unsure of yourself, see the following: http://youtu.be/nuHfVn_cfHU # # Also, these are Java 8 settings to use 4/8 gig ram. If you have Java 7, make changes! #Settings PATH=/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin SERVICE='KCauldron.jar' OPTIONS='nogui' USERNAME='root' MCPATH='/usr/local/games/minecraft/infinity' MCNOSTART=$MCPATH/.nostart MCCRASH=$MCPATH/crash-reports MCLOG=$MCPATH/logs/fml-server-latest.log MAXHEAP=4096 MINHEAP=2048 PERM=256 HISTORY=1024 CPU_COUNT=8 INVOCATION="java -server \ -Xms${MINHEAP}m \ -Xmx${MAXHEAP}m \ -XX:PermSize=${PERM}m \ -XX:d64 \ -XX:+UseParNewGC \ -XX:+CMSIncrementalPacing \ -XX:+CMSClassUnloadingEnabled \ -XX:ParallelGCThreads=2 \ -XX:MinHeapFreeRatio=5 \ -XX:MaxHeapFreeRatio=10 \ -Djava.net.preferIPv4Stack=true \ -jar $SERVICE $OPTIONS" 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 && screen -h $HISTORY -dmS minecraft $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_disableAuto() { echo "Disabling autostart" touch $MCNOSTART } mc_enableAuto() { if [[ -a $MCNOSTART ]] ; then echo "Enabling autostart" rm $MCNOSTART fi } mc_stop() { if pgrep -u $USERNAME -f $SERVICE > /dev/null then echo "Stopping $SERVICE" as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SHUTTING DOWN IN 60 SECONDS.\"\015'" sleep 30 as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SHUTTING DOWN IN 30 SECONDS.\"\015'" sleep 15 as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SHUTTING DOWN IN 15 SECONDS.\"\015'" sleep 15 as_user "screen -p 0 -S minecraft -X eval 'stuff \"stop\"\015'" sleep 15 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_restartannounce() { if pgrep -u $USERNAME -f $SERVICE > /dev/null then echo "Broadcasting Restart" as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SCHEDULED RESTART IMMINENT, RESISTANCE IS FUTILE\"\015'" sleep 20 else echo "$SERVICE was not running." exit 1 fi } mc_stopnow() { if pgrep -u $USERNAME -f $SERVICE > /dev/null then echo "Stopping $SERVICE" as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SHUTTING DOWN IN 5 SECONDS.\"\015'" sleep 5 as_user "screen -p 0 -S minecraft -X eval 'stuff \"stop\"\015'" sleep 15 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_logcheck() { CRASH=$(find $MCCRASH -maxdepth 1 -name '*.log' -print -quit -cmin -60) MCLOGLAST=$(stat -x $MCLOG) MCLOGDATA=$(tail -n 150 $MCLOG) if [[ -n $CRASH ]] ; then echo "We have a crash log: $CRASH" echo "Sending email to local account" ( $MCLOGLAST ; tail -n 150 $MCLOG ; uuencode $CRASH $CRASH ) | mailx -s "Minecraft Server Crash" $USERNAME else if [[ ! -a $MCNOSTART ]] ; then echo "Server not running, Autostart enabled" echo "Last log entry from FML:" stat -f "%m%t%Sm %N" $MCLOG | cut -f2 echo "Restarting Minecraft Server" sleep 10 mc_start fi fi } #Start-Stop here case "$1" in start) mc_start mc_enableAuto ;; stop) mc_disableAuto mc_stop ;; stopnow) mc_disableAuto mc_stopnow ;; restart) mc_disableAuto mc_restartannounce mc_stopnow sleep 20 mc_start mc_enableAuto ;; status) if pgrep -u $USERNAME -f $SERVICE > /dev/null then echo "$SERVICE is running." else echo "$SERVICE is not running." fi ;; croncheck) if ! pgrep -u $USERNAME -f $SERVICE > /dev/null then mc_logcheck fi ;; *) echo "Usage: $0 {start|stop|stopnow|restart|status|croncheck}" exit 1 ;; esac exit 0