Advertisement
kreezxil

FTB Bash Script Server Wrapper

Mar 19th, 2014
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 7.56 KB | None | 0 0
  1. #!/bin/bash
  2. # /etc/init.d/minecraft <-- you could put it there or in cron, I use it in cron.
  3. # version 0.5.0 2014-03-19 (YYYY-MM-DD)
  4.  
  5. ### BEGIN INIT INFO
  6. # Provides:   minecraft
  7. # Required-Start: $local_fs $remote_fs
  8. # Required-Stop:  $local_fs $remote_fs
  9. # Should-Start:   $network
  10. # Should-Stop:    $network
  11. # Default-Start:  2 3 4 5
  12. # Default-Stop:   0 1 6
  13. # Short-Description:    Minecraft server
  14. # Description:    Starts the minecraft server
  15. ### END INIT INFO
  16.  
  17. #Settings
  18. SERVICE='FTBServer.jar'
  19. OPTIONS='nogui'
  20. USERNAME='root'
  21. WORLD='world'
  22. MCPATH='/path/to/server'
  23. BACKUPPATH="${MCPATH}.backup"
  24. SESSIONNAME='monster'
  25. SESSION=$SESSIONNAME
  26. ACTION='SHUTTING DOWN'
  27. MAXHEAP=4096
  28. MINHEAP=2048
  29. PERMSIZE=128
  30. HISTORY=128
  31. CPU_COUNT=2
  32. INVOCATION="java -Xmx${MAXHEAP}M -Xms${MINHEAP}M -XX:PermSize=${PERMSIZE}M  -XX:MaxPermSize=128M -XX:+UseConcMarkSweepGC \
  33. -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=$CPU_COUNT -XX:+AggressiveOpts \
  34. -jar ${MCPATH}/${SERVICE} $OPTIONS"
  35.  
  36. ME=`whoami`
  37. as_user() {
  38.   if [ $ME == $USERNAME ] ; then
  39.     bash -c "$1"
  40.   else
  41.     su - $USERNAME -c "$1"
  42.   fi
  43. }
  44.  
  45. mc_start() {
  46.   # A good place as any to remove dead screens
  47.   screen -wipe
  48.   as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"save-on\"\015'"
  49.  
  50.   if  pgrep -u $USERNAME -f $SERVICE > /dev/null
  51.   then
  52.     echo "$SERVICE is already running!"
  53.   else
  54.     echo "Starting $SERVICE..."
  55.     cd $MCPATH
  56.     as_user "cd $MCPATH && screen -h $HISTORY -dmS $SESSIONNAME $INVOCATION"
  57.     sleep 7
  58.     if pgrep -u $USERNAME -f $SERVICE > /dev/null
  59.     then
  60.       echo "$SERVICE is now running."
  61.     else
  62.       echo "Error! Could not start $SERVICE!"
  63.     fi
  64.   fi
  65. }
  66.  
  67. mc_saveoff() {
  68.   if pgrep -u $USERNAME -f $SERVICE > /dev/null
  69.   then
  70.     echo "$SERVICE is running... suspending saves"
  71.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"say SERVER BACKUP STARTING. Server going readonly...\"\015'"
  72.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"save-off\"\015'"
  73.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"save-all\"\015'"
  74.     sync
  75.     sleep 10
  76.   else
  77.     echo "$SERVICE is not running. Not suspending saves."
  78.   fi
  79. }
  80.  
  81. mc_saveon() {
  82.   if pgrep -u $USERNAME -f $SERVICE > /dev/null
  83.   then
  84.     echo "$SERVICE is running... re-enabling saves"
  85.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"save-on\"\015'"
  86.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"say SERVER BACKUP ENDED. Server going read-write...\"\015'"
  87.   else
  88.     echo "$SERVICE is not running. Not resuming saves."
  89.   fi
  90. }
  91.  
  92. mc_stop() {
  93.   if pgrep -u $USERNAME -f $SERVICE > /dev/null
  94.   then
  95.     echo "Stopping $SERVICE"
  96.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"say SERVER $ACTION IN 5 MINUTES. Saving map...\"\015'"
  97.     echo "Announced to server a 5 minute shutdown time"
  98.     sleep 60
  99.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"say SERVER $ACTION IN 4 MINUTES.\"\015'"
  100.     sleep 60
  101.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"say SERVER $ACTION IN 3 MINUTES.\"\015'"
  102.     sleep 60
  103.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"say SERVER $ACTION IN 2 MINUTES.\"\015'"
  104.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"save-all\"\015'"
  105.     echo "Issued save-all command via console"
  106.     sleep 60
  107.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"say SERVER $ACTION IN 1 MINUTE.\"\015'"
  108.     sleep 60
  109.     echo "Telling the server to stop!"
  110.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"say SERVER $ACTION IN 0 SECONDS.\"\015'"
  111.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"stop\"\015'"
  112.     echo "Waiting 2 more minutes! $SESSIONNAME is a pig you know!"
  113.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"say SERVER $ACTION IN 0 SECONDS! IT IS YOUR FAULT IF YOU LOSE STUFF!.\"\015'"
  114.     sleep 120
  115.   else
  116.     echo "$SERVICE was not running."
  117.   fi
  118.   if pgrep -u $USERNAME -f $SERVICE > /dev/null
  119.   then
  120.     mc_forcekill
  121.   else
  122.     echo "Success! $SERVICE is stopped!"
  123.   fi
  124. }
  125.  
  126. mc_forcekill() {
  127.    echo "Error! $SERVICE could not be stopped."
  128.    echo "Forcefully killing SCREEN associated with $SERVICE!"
  129.    kill -9 `ps aux | grep SCREEN | grep $SERVICE | awk '{print $2}'` #kill screen that manages this service
  130.    if pgrep -u $USERNAME -f $SERVICE > /dev/null
  131.    then
  132.       mc_nuke_java
  133.    else
  134.       echo "Success! $SERVICE is stopped!"
  135.    fi
  136. }
  137.  
  138. mc_nuke_java() {
  139.       echo "There was a serious ass problem! I can't kill $SERVICE at all!"
  140.       echo "Drastic measures enabled, killing java outright!"
  141.       #kill -9 `pgrep java`
  142.       kill -9 `ps aux | grep $SESSION | awk '{print $2}'` #kill screen that manages this service
  143.  
  144.       if pgrep -u $USERNAME -f $SERVICE > /dev/null
  145.       then
  146.         echo "Congratulations your sytem is pretty much fucked! What are you running?"
  147.       else
  148.         echo "Drastic measures SUCCESSFUL! $SERVICE is stopped!"
  149.       fi
  150. }
  151.  
  152. mc_update() {
  153.   if pgrep -u $USERNAME -f $SERVICE > /dev/null
  154.   then
  155.     echo "$SERVICE is running! Will not start update."
  156.   else
  157.     MC_SERVER_URL=http://s3.amazonaws.com/MinecraftDownload/launcher/minecraft_server.jar?v=`date | sed "s/[^a-zA-Z0-9]/_/g"`
  158.     as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update $MC_SERVER_URL"
  159.     if [ -f $MCPATH/minecraft_server.jar.update ]
  160.     then
  161.       if `diff $MCPATH/$SERVICE $MCPATH/minecraft_server.jar.update >/dev/null`
  162.       then
  163.         echo "You are already running the latest version of $SERVICE."
  164.       else
  165.         as_user "mv $MCPATH/minecraft_server.jar.update $MCPATH/$SERVICE"
  166.         echo "Minecraft successfully updated."
  167.       fi
  168.     else
  169.       echo "Minecraft update could not be downloaded."
  170.     fi
  171.   fi
  172. }
  173.  
  174. mc_backup() {
  175.    mc_saveoff
  176.    
  177.    NOW=`date "+%Y-%m-%d_%Hh%M"`
  178.    BACKUP_FILE="$BACKUPPATH/${WORLD}_${NOW}.tar"
  179.    echo "Backing up minecraft world..."
  180.    #as_user "cd $MCPATH && cp -r $WORLD $BACKUPPATH/${WORLD}_`date "+%Y.%m.%d_%H.%M"`"
  181.    as_user "tar -C \"$MCPATH\" -cf \"$BACKUP_FILE\" $WORLD"
  182.  
  183.    echo "Backing up $SERVICE"
  184.    as_user "tar -C \"$MCPATH\" -rf \"$BACKUP_FILE\" $SERVICE"
  185.    #as_user "cp \"$MCPATH/$SERVICE\" \"$BACKUPPATH/minecraft_server_${NOW}.jar\""
  186.  
  187.    mc_saveon
  188.  
  189.    echo "Compressing backup..."
  190.    as_user "gzip -f \"$BACKUP_FILE\""
  191.    echo "Done."
  192. }
  193.  
  194. mc_command() {
  195.   command="$1";
  196.   if pgrep -u $USERNAME -f $SERVICE > /dev/null
  197.   then
  198.     pre_log_len=`wc -l "$MCPATH/server.log" | awk '{print $1}'`
  199.     echo "$SERVICE is running... executing command"
  200.     as_user "screen -p 0 -S $SESSIONNAME -X eval 'stuff \"$command\"\015'"
  201.     sleep .1 # assumes that the command will run and print to the log file in less than .1 seconds
  202.     # print output
  203.     tail -n $[`wc -l "$MCPATH/server.log" | awk '{print $1}'`-$pre_log_len] "$MCPATH/server.log"
  204.   fi
  205. }
  206.  
  207. #Start-Stop here
  208. case "$1" in
  209.   start)
  210.     mc_start
  211.     ;;
  212.   stop)
  213.     mc_stop
  214.     ;;
  215.   kill)
  216.     mc_forcekill
  217.     ;;
  218.   nuke)
  219.     mc_nuke_java
  220.     ;;
  221.   restart)
  222.     ACTION='REBOOTING'
  223.     mc_stop
  224.     mc_start
  225.     ;;
  226.   update)
  227.     mc_stop
  228.     mc_backup
  229.     mc_update
  230.     mc_start
  231.     ;;
  232.   backup)
  233.     mc_backup
  234.     ;;
  235.   status)
  236.     if pgrep -u $USERNAME -f $SERVICE > /dev/null
  237.     then
  238.       echo "$SERVICE is running."
  239.     else
  240.       echo "$SERVICE is not running."
  241.     fi
  242.     ;;
  243.   command)
  244.     if [ $# -gt 1 ]; then
  245.       shift
  246.       mc_command "$*"
  247.     else
  248.       echo "Must specify server command (try 'help'?)"
  249.     fi
  250.     ;;
  251.  
  252.   *)
  253.   echo "Usage: $0 {start|stop|kill|nuke|update|backup|status|restart|command \"server command\"}"
  254.   exit 1
  255.   ;;
  256. esac
  257.  
  258. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement