#!/bin/bash if [[ -z $1 ]]; then echo "Usage: $0 backup_dir" exit 2 fi backup_dir=$1 # get name of world loaded into server world=$(grep ^level-name= "/home/mcadmin/server.properties" | cut -d = -f 2- -s) # check if world name is empty if [[ -z $world ]]; then echo "Error: world-name field seems to be empty. Check server.properties file." exit 1 fi worlds_dir="/home/mcadmin/worlds" if [[ ! -d "$worlds_dir/$world" ]]; then echo "Error: world \"$world\" not found in $worlds_dir. Check server.properties file as well." exit 1 fi # Check if server is active status=$(systemctl show mcbe -p ActiveState --value) # if service is not active, just rsync folder directly. if [[ $status != active ]]; then echo "Service is inactive: running rsync directly." rsync -a "$worlds_dir/" "$backup_dir/" exit fi # create backup dir if [[ ! -d "$backup_dir" ]]; then echo "Creating directory \"$backup_dir\" ..." mkdir -p "$backup_dir" fi cd "$backup_dir" # prepare backup of active world status=$(mcbe-exec save hold) if [[ $status == "The command is already running" ]]; then echo "Error: a save seems to be currently in progress. Did the previous save run correctly?" mcbe-exec save resume exit 1 fi timeout=0 buffer=$(mcbe-exec save query) until echo "$buffer" | grep -q 'Data saved'; do # 1 minute timeout if [[ "$timeout" -eq 60 ]]; then echo "Error: save timed out." mcbe-exec save resume exit 1 fi sleep 1 timeout=$(( ++timeout )) buffer=$(mcbe-exec save query) done files=$(echo "$buffer" | grep -Eo "${world}[^:]+:[0-9]+") # copy files for active world echo "$files" | while read -r line; do file=${line%:*} size=${line#*:} mkdir -p "$(dirname "$file")" rsync -a "$worlds_dir/$file" "$file" truncate --size="$size" "$file" done # tell minecraft it can resume mcbe-exec save resume # delete old inactive worlds ls -w 1 | grep -v -E "^$world\$" | while read -r line; do if [[ ! -e "$worlds_dir/$line" ]]; then rm -r "$line" fi done # copy inactive worlds ls -w 1 "$worlds_dir" | grep -v -E "^$world\$" | while read -r line; do rsync -a "$worlds_dir/$line" ./ done # make sure everything is owned by worlds owner chown -R "$(stat -c %U:%G $worlds_dir)" ./ # touch backup dir to update its last-edited date touch ./