Skip to content

Instantly share code, notes, and snippets.

@neclimdul
Created July 4, 2015 19:46
Show Gist options
  • Save neclimdul/caf0d5f39949b503543f to your computer and use it in GitHub Desktop.
Save neclimdul/caf0d5f39949b503543f to your computer and use it in GitHub Desktop.
Minecraft server admin script.
#!/bin/bash
## Name of the script used to start the server.
# This will be written by this script in the directory you run it in.
# Avoid ServerStart.sh because this will collide with FTB Server scripts.
CONTROL_SCRIPT="ServerAdminStart.sh"
## Memory options
# -Xms controls initial memory.
# -Xmx controls maximum memory threshold.
# PermSize is something...
MEMORY_OPTS="-Xms512m -Xmx2000m -XX:PermSize=256m"
## Additional java options.
# Basic optimizations.
JAVA_OPTIONS="-d64 -server -XX:+UseConcMarkSweepGC -XX:+UseParNewGC"
# Some random optimized config from the internet.
#JAVA_OPTIONS="-d64 -server -XX:CompileThreshold=3000 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxHeapFreeRatio=20 -XX:MinHeapFreeRatio=12 -XX:NewSize=100m -XX:SurvivorRatio=6 -XX:MaxTenuringThreshold=4"
# FTB Server optimizations
JAVA_OPTIONS="-d64 -XX:+UseParNewGC -XX:+CMSIncrementalPacing -XX:+CMSClassUnloadingEnabled -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10"
# I have no idea where this came from..
JAVA_LOG_OPTIONS=" -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -Xloggc:GC.log"
# If you want to play with JMX debuging you can uncomment these and poke around.
JMXPORT=9010
JMXPWFILE="$HOME/jmxremote.password"
JMXACCESSFILE="$HOME/jmxremote.access"
#JMX_OPTIONS="-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.port=$JMXPORT -Dcom.sun.management.jmxremote.password.file=$JMXPWFILE -Dcom.sun.management.jmxremote.access.file=$JMXACCESSFILE"
#JMX_OPTIONS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=$JMXPORT -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=localmachine.example.com"
JMX_OPTIONS=""
## END CONFIG ##
# Everything below this shouldn't be modified.
BACKGROUND=${BACKGROUND:-1}
# Inform user if eula.txt not found.
if [ ! -f eula.txt ]; then
echo "Missing eula.txt. Startup will fail and eula.txt will be created"
echo "Make sure to read eula.txt before playing!"
BACKGROUND=0
else
# Check if they have accepted the eula.
if grep -q 'eula=false' eula.txt; then
echo "Make sure to read eula.txt before playing!"
exit 1
fi
fi
# Locate the server jar.
FORGE_JAR=`find . -name forge\*.jar | tail -n1`
if [ -z $FORGE_JAR ]; then
FORGE_JAR=`find . -name FTBServer\*.jar | tail -n1`
fi
if [ -z $FORGE_JAR ]; then
echo $FORGE_JAR
echo "No server jar found. Can not continue."
echo "Supported jar files match the pattern forge*.jar or FTBServer*.jar."
exit 1
fi
# Command to start the server.
INVOKE="java ${MEMORY_OPTS} ${JAVA_OPTIONS} ${JMX_OPTIONS} -jar $FORGE_JAR nogui 2>&1 | tee minecraft.log"
# Build screen session name.
PACKNAME=`pwd | cut -d'/' -f4`
SCREEN_SESSION=$PACKNAME
# Write startup script.
write_script() {
echo $INVOKE > $CONTROL_SCRIPT
chmod u+x $CONTROL_SCRIPT
}
##
# Start the server.
#
cl_start() {
if [ $BACKGROUND -eq 1 ]; then
if ! screen -list | grep -q $SCREEN_SESSION; then
echo "Starting Server in background"
write_script
screen -dmS $SCREEN_SESSION ./$CONTROL_SCRIPT
sleep 1
if ! screen -list | grep -q $SCREEN_SESSION; then
cat minecraft.log
echo ""
echo "Server failed to start!"
exit 1
fi
echo "Successfully started server"
else
echo "Server already started."
exit
fi
else
write_script
./$CONTROL_SCRIPT
fi
}
##
# Stop the server.
cl_stop() {
if ! screen -list | grep -q $SCREEN_SESSION; then
exit
fi
echo 'Saving...'
screen -p 0 -S $SCREEN_SESSION -X eval 'stuff "say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map..."\015'
screen -p 0 -S $SCREEN_SESSION -X eval 'stuff "save-all"\015'
sleep 10
echo 'Stopping'
screen -p 0 -S $SCREEN_SESSION -X eval 'stuff "stop"\015'
sleep 3
}
while [ "$1" != "" ]; do
case $1 in
--start )
cl_start
;;
-s | --stop )
cl_stop
exit
;;
* )
echo "Give me a command. --start or --stop"
;;
esac
shift
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment