콘텐츠로 이동

월드 자동 백업

서버에 백업 스크립트를 만든다.

Terminal window
sudo vim /root/backup.sh

아래 내용을 파일에 붙여 넣고 필요에 맞게 고친다(Linux 초보라면 건드리지 않는 편이 낫다).

#!/bin/bash
usage() {
echo "사용법: $0 --server-dir <서버 경로> --backup-dir <백업 저장 디렉터리> [--max-backups <최대 백업 파일 수>]"
echo "인자:"
echo " --server-dir, -s: 서버 디렉터리 (절대 경로)"
echo " --backup-dir, -b: 백업 저장 디렉터리 (절대 경로)"
echo " --max-backups, -m: 최대 백업 파일 수, 선택 (기본값: 5)"
exit 1
}
PARSED_ARGUMENTS=$(getopt -n "$0" -o s:b:m: --long server-dir:,backup-dir:,max-backups: -- "$@")
if [ $? -ne 0 ]; then
usage
fi
eval set -- "$PARSED_ARGUMENTS"
while true; do
case "$1" in
-s|--server-dir)
SERVER_DIR=$2
shift 2
;;
-b|--backup-dir)
BACKUP_DIR=$2
shift 2
;;
-m|--max-backups)
MAX_BACKUPS=$2
shift 2
;;
--)
shift
break
;;
*)
usage
;;
esac
done
# 필수 인자가 주어졌는지 확인
if [ -z "$SERVER_DIR" ] || [ -z "$BACKUP_DIR" ]; then
usage
fi
# SERVER_DIR/server.properties가 있는지 확인
if [ ! -f "$SERVER_DIR/server.properties" ]; then
echo "$SERVER_DIR/server.properties 파일이 없다"
exit 1
fi
# 백업 저장 디렉터리가 있는지 확인
if [ ! -d "$BACKUP_DIR" ]; then
echo "백업 저장 디렉터리 $BACKUP_DIR 가 없어 새로 만든다"
mkdir -p $BACKUP_DIR || exit 1
fi
# 최대 백업 파일 수가 양의 정수인지 확인
if [ -z "$MAX_BACKUPS" ]; then
MAX_BACKUPS=5
elif ! [[ "$MAX_BACKUPS" =~ ^[1-9][0-9]*$ ]]; then
echo "최대 백업 파일 수는 양의 정수여야 한다"
exit 1
fi
# 월드 백업
SERVER_PARENT_DIR=$(dirname $SERVER_DIR)
SERVER_NAME=$(basename $SERVER_DIR)
cd $SERVER_PARENT_DIR || exit
time=$(date "+%Y%m%d-%H%M%S")
tar -czvf "${time}.tar.gz" $SERVER_NAME
mv "${time}.tar.gz" $BACKUP_DIR
# 오래된 백업 파일 삭제
cd $BACKUP_DIR || exit
tar_gz_files=($(ls -t *.tar.gz))
if [ ${#tar_gz_files[@]} -gt $MAX_BACKUPS ]; then
rm "${tar_gz_files[${#tar_gz_files[@]}-1]}"
fi

Esc를 누르고 영문 입력 상태에서 :wq를 입력해 저장하고 나간다.

백업 스크립트를 예약 작업에 등록

섹션 제목: “백업 스크립트를 예약 작업에 등록”

crontab을 편집한다.

Terminal window
crontab -e

파일 끝에 다음 내용을 추가한다.

Terminal window
0 3 * * * /bin/bash /root/backup.sh -s /path/to/server -b /path/to/backup -m 5
# 서버가 여러 대라면 백업 작업을 여러 개 추가하면 된다
# 0 3 * * * /bin/bash /root/backup.sh -s /path/to/server2 -b /path/to/backup2 -m 5
# 0 3 * * * /bin/bash /root/backup.sh -s /path/to/server3 -b /path/to/backup3 -m 5
# 이하 같은 방식...

각 항목은 다음과 같다.

  • /path/to/server: 서버 디렉터리의 절대 경로로 바꾼다.
  • /path/to/backup: 백업 저장 디렉터리의 절대 경로로 바꾼다.
  • 5: 최대 백업 파일 수.

서버 디렉터리의 절대 경로는 어떻게 알 수 있을까? 해당 디렉터리에서 pwd 명령을 실행하면 현재 디렉터리의 절대 경로가 나온다.

위 예시는 매일 새벽 3시에 백업 스크립트를 실행한다. 여기서 0 3 * * *가 cron 표현식이다.

자주 쓰는 cron 표현식 몇 가지를 소개한다.

  • 0 3 * * *: 매일 새벽 3시
  • 0 3 * * 0: 매주 일요일 새벽 3시
  • 0 3 1 * *: 매월 1일 새벽 3시
  • 0 3 * * 1: 매주 월요일 새벽 3시
  • 0 3 * * 1,3,5: 매주 월, 수, 금요일 새벽 3시
  • 0 3 * * 1-5: 매주 월요일부터 금요일까지 새벽 3시
  • 0 3 * * 1-5: 매주 월요일부터 금요일까지 새벽 3시
  1. 복원할 백업 파일을 고른다.
  2. 백업 파일의 압축을 푼다: tar -zxvf 백업파일명.tar.gz
  3. 압축을 푼 파일을 서버 디렉터리에 덮어쓴다: cp -r 압축푼경로/* 서버디렉터리

복원 후 서버를 켰을 때 다음 오류가 난다면:

[main/FATAL]: Failed to start the minecraft server net.minecraft.util.SessionLock$ExceptionWorldConfict: /home/minecraft/lobby/./world/session.lock: already locked (possibly by other Minecraft instance?)

world 폴더에 session.lock 파일이 있는지 확인하고, 있으면 지운 뒤 서버를 다시 켠다.