#!/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
Comments