Advertisement
Guest User

Minecraft Init Script

a guest
Nov 30th, 2013
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.83 KB | None | 0 0
  1. #!/bin/bash
  2. # /etc/init.d/minecraft
  3. # Requires: bash, java7, curl, rsync, mcrcon
  4. # Author: Tom Arnold <tom9729@gmail.com>
  5. # Version: 2013.11.30
  6.  
  7. ### BEGIN INIT INFO
  8. # Provides:   minecraft
  9. # Required-Start: $local_fs $remote_fs
  10. # Required-Stop:  $local_fs $remote_fs
  11. # Should-Start:   $network
  12. # Should-Stop:    $network
  13. # Default-Start:  2 3 4 5
  14. # Default-Stop:   0 1 6
  15. # Short-Description:    Minecraft server
  16. # Description:    Starts the minecraft server
  17. ### END INIT INFO
  18.  
  19. minecraft_home="/opt/minecraft"
  20. minecraft_user="minecraft"
  21. minecraft_world="world"
  22. minecraft_cmd="java -Xincgc -Xmx3072M -Xms3072M -server -jar minecraft_server.jar nogui"
  23. minecraft_backup_max="3000"
  24. minecraft_rcon_cmd="$minecraft_home/mcrcon -H localhost -P 25576 -p changeme -s"
  25.  
  26. minecraft_cmd_exec() {
  27.     $minecraft_rcon_cmd "$*"
  28. }
  29.  
  30. minecraft_say() {
  31.     minecraft_cmd_exec "say $@"
  32. }
  33.  
  34. minecraft_start() {
  35.     if [ `minecraft_status` ]; then return; fi
  36.        
  37.     cd "${minecraft_home}"
  38.     nohup $minecraft_cmd > /dev/null 2>&1 &
  39. }
  40.  
  41. minecraft_stop() {
  42.     if [ ! `minecraft_status` ]; then return; fi
  43.  
  44.     cd "$minecraft_home"
  45.    
  46.     ## Save world.
  47.     minecraft_cmd_exec "save-all"
  48.     minecraft_cmd_exec "save-off"
  49.     sleep 1
  50.     sync
  51.    
  52.     ## Kill minecraft.
  53.     kill -9 `minecraft_status`
  54.     sleep 1
  55. }
  56.  
  57. minecraft_restart() {
  58.     minecraft_stop
  59.     minecraft_start
  60. }
  61.  
  62. minecraft_backup() {
  63.     cd "${minecraft_home}"
  64.  
  65.     logger "Starting backup."
  66.  
  67.     ## List & count existing backups.
  68.     local backup_list=`mktemp`
  69.     ls backup | grep "${minecraft_world}-" > "$backup_list"
  70.     local backup_count=`wc -l "$backup_list" | cut -d " " -f 1`
  71.     local backup_delta=$(($backup_count - $minecraft_backup_max))
  72.    
  73.     ## Do we have more backups than we want?
  74.     if [ "$backup_delta" -gt "0" ];
  75.     then
  76.     ## Delete old backups.
  77.     logger "Purging $backup_delta old backups."
  78.     head -$backup_delta "$backup_list" | xargs -I {} rm -rf "backup/{}"
  79.     fi
  80.  
  81.     ## Cleanup.
  82.     rm "$backup_list"
  83.  
  84.     ## Disable save to prevent corruption.
  85.     minecraft_cmd_exec "save-all"
  86.     minecraft_cmd_exec "save-off"
  87.     sleep 1
  88.     sync
  89.  
  90.     backup="${minecraft_world}-`date +%Y.%m.%d-%H.%M.%S`"
  91.     prev_backup=`ls backup | tail -n 1`
  92.  
  93.     logger "Backing up world (backup/$backup)."
  94.    
  95.     if [ -z "${prev_backup}" ]
  96.     then
  97.     ## Make a baseline.
  98.         cp -a "${minecraft_world}" "backup/${backup}"
  99.     else
  100.         ## Incremental backups using hardlinks and rsync.
  101.         rsync -a --delete --link-dest="${minecraft_home}/backup/${prev_backup}" "${minecraft_world}" "backup/${backup}"
  102.     fi
  103.    
  104.     ## Make a symbolic link to the latest backup.
  105.     rm -f backup/latest
  106.     ln -s "${minecraft_home}/backup/${backup}" backup/latest
  107.  
  108.     ## Enable save.
  109.     minecraft_cmd_exec "save-on"
  110.  
  111.     logger "Finished backup."
  112. }
  113.  
  114. minecraft_proc_list() {
  115.     local proc_list=`mktemp`
  116.     ps -u "$minecraft_user" -o pid,cmd > "$proc_list"
  117.     echo "$proc_list"
  118. }
  119.  
  120. minecraft_status() {
  121.     local proc_list=`minecraft_proc_list`
  122.     grep "java .* minecraft_server.jar" "$proc_list" | sed -e 's/^ *\([0-9]*\) .*$/\1/'
  123.     rm "$proc_list"
  124. }
  125.  
  126. minecraft_update() {
  127.     cd ${minecraft_home}
  128.  
  129.     ## Try to figure out URL for latest release.
  130.     local version_url="https://s3.amazonaws.com/Minecraft.Download/versions/versions.json"
  131.     local version=`curl -s "$version_url" | grep '"release"\s*:' | sed -e 's/^.*:.*\"\(.*\)\".*$/\1/'`
  132.     local release="minecraft_server.$version.jar"
  133.     local release_url="https://s3.amazonaws.com/Minecraft.Download/versions/$version/$release"
  134.  
  135.     ## Check if we already have a server like that.
  136.     if [ -e "$release" ];
  137.     then
  138.     ## Already at latest.
  139.     return 0
  140.     fi
  141.    
  142.     ## Download server JAR.
  143.     echo "Getting latest release: $release"
  144.     curl -s "$release_url" -o "$release"
  145.    
  146.     ## Shutdown server for update.
  147.     minecraft_say "Server going down for update."
  148.     minecraft_stop
  149.    
  150.     ## Point softlink at new release.
  151.     rm minecraft_server.jar
  152.     ln -s "$release" minecraft_server.jar
  153.    
  154.     ## Bring server back up.
  155.     minecraft_start
  156. }
  157.  
  158. minecraft_main() {
  159.     ## Make sure that this script is run as minecraft_user.
  160.     case `whoami` in
  161.         ## Escape if we are minecraft_user.
  162.     ${minecraft_user});;
  163.         ## Relaunch as appropriate user.
  164.     root)
  165.         su ${minecraft_user} $0 $@
  166.         exit $?
  167.         ;;
  168.         ## Not minecraft_user and can't su, so die.
  169.     *)
  170.         echo "fatal: must be run as (root, ${minecraft_user})" 1>&2
  171.         exit 1
  172.         ;;
  173.     esac
  174.  
  175.     local cmd="$1"
  176.     shift
  177.    
  178.     case "$cmd" in
  179.     start|stop|restart|backup|update|status|say)
  180.         ;;
  181.     *)
  182.         echo "Usage: $0 {start|stop|restart|backup|update|status|say} [...]" 1>&2
  183.         return 1
  184.         ;;
  185.     esac
  186.  
  187.     minecraft_$cmd $@
  188. }
  189.  
  190. minecraft_main $@
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement