Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # /etc/init.d/minecraft
- # Requires: bash, java7, curl, rsync, mcrcon
- # Author: Tom Arnold <tom9729@gmail.com>
- # Version: 2013.11.30
- ### BEGIN INIT INFO
- # Provides: minecraft
- # Required-Start: $local_fs $remote_fs
- # Required-Stop: $local_fs $remote_fs
- # Should-Start: $network
- # Should-Stop: $network
- # Default-Start: 2 3 4 5
- # Default-Stop: 0 1 6
- # Short-Description: Minecraft server
- # Description: Starts the minecraft server
- ### END INIT INFO
- minecraft_home="/opt/minecraft"
- minecraft_user="minecraft"
- minecraft_world="world"
- minecraft_cmd="java -Xincgc -Xmx3072M -Xms3072M -server -jar minecraft_server.jar nogui"
- minecraft_backup_max="3000"
- minecraft_rcon_cmd="$minecraft_home/mcrcon -H localhost -P 25576 -p changeme -s"
- minecraft_cmd_exec() {
- $minecraft_rcon_cmd "$*"
- }
- minecraft_say() {
- minecraft_cmd_exec "say $@"
- }
- minecraft_start() {
- if [ `minecraft_status` ]; then return; fi
- cd "${minecraft_home}"
- nohup $minecraft_cmd > /dev/null 2>&1 &
- }
- minecraft_stop() {
- if [ ! `minecraft_status` ]; then return; fi
- cd "$minecraft_home"
- ## Save world.
- minecraft_cmd_exec "save-all"
- minecraft_cmd_exec "save-off"
- sleep 1
- sync
- ## Kill minecraft.
- kill -9 `minecraft_status`
- sleep 1
- }
- minecraft_restart() {
- minecraft_stop
- minecraft_start
- }
- minecraft_backup() {
- cd "${minecraft_home}"
- logger "Starting backup."
- ## List & count existing backups.
- local backup_list=`mktemp`
- ls backup | grep "${minecraft_world}-" > "$backup_list"
- local backup_count=`wc -l "$backup_list" | cut -d " " -f 1`
- local backup_delta=$(($backup_count - $minecraft_backup_max))
- ## Do we have more backups than we want?
- if [ "$backup_delta" -gt "0" ];
- then
- ## Delete old backups.
- logger "Purging $backup_delta old backups."
- head -$backup_delta "$backup_list" | xargs -I {} rm -rf "backup/{}"
- fi
- ## Cleanup.
- rm "$backup_list"
- ## Disable save to prevent corruption.
- minecraft_cmd_exec "save-all"
- minecraft_cmd_exec "save-off"
- sleep 1
- sync
- backup="${minecraft_world}-`date +%Y.%m.%d-%H.%M.%S`"
- prev_backup=`ls backup | tail -n 1`
- logger "Backing up world (backup/$backup)."
- if [ -z "${prev_backup}" ]
- then
- ## Make a baseline.
- cp -a "${minecraft_world}" "backup/${backup}"
- else
- ## Incremental backups using hardlinks and rsync.
- rsync -a --delete --link-dest="${minecraft_home}/backup/${prev_backup}" "${minecraft_world}" "backup/${backup}"
- fi
- ## Make a symbolic link to the latest backup.
- rm -f backup/latest
- ln -s "${minecraft_home}/backup/${backup}" backup/latest
- ## Enable save.
- minecraft_cmd_exec "save-on"
- logger "Finished backup."
- }
- minecraft_proc_list() {
- local proc_list=`mktemp`
- ps -u "$minecraft_user" -o pid,cmd > "$proc_list"
- echo "$proc_list"
- }
- minecraft_status() {
- local proc_list=`minecraft_proc_list`
- grep "java .* minecraft_server.jar" "$proc_list" | sed -e 's/^ *\([0-9]*\) .*$/\1/'
- rm "$proc_list"
- }
- minecraft_update() {
- cd ${minecraft_home}
- ## Try to figure out URL for latest release.
- local version_url="https://s3.amazonaws.com/Minecraft.Download/versions/versions.json"
- local version=`curl -s "$version_url" | grep '"release"\s*:' | sed -e 's/^.*:.*\"\(.*\)\".*$/\1/'`
- local release="minecraft_server.$version.jar"
- local release_url="https://s3.amazonaws.com/Minecraft.Download/versions/$version/$release"
- ## Check if we already have a server like that.
- if [ -e "$release" ];
- then
- ## Already at latest.
- return 0
- fi
- ## Download server JAR.
- echo "Getting latest release: $release"
- curl -s "$release_url" -o "$release"
- ## Shutdown server for update.
- minecraft_say "Server going down for update."
- minecraft_stop
- ## Point softlink at new release.
- rm minecraft_server.jar
- ln -s "$release" minecraft_server.jar
- ## Bring server back up.
- minecraft_start
- }
- minecraft_main() {
- ## Make sure that this script is run as minecraft_user.
- case `whoami` in
- ## Escape if we are minecraft_user.
- ${minecraft_user});;
- ## Relaunch as appropriate user.
- root)
- su ${minecraft_user} $0 $@
- exit $?
- ;;
- ## Not minecraft_user and can't su, so die.
- *)
- echo "fatal: must be run as (root, ${minecraft_user})" 1>&2
- exit 1
- ;;
- esac
- local cmd="$1"
- shift
- case "$cmd" in
- start|stop|restart|backup|update|status|say)
- ;;
- *)
- echo "Usage: $0 {start|stop|restart|backup|update|status|say} [...]" 1>&2
- return 1
- ;;
- esac
- minecraft_$cmd $@
- }
- minecraft_main $@
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement