1. 需求分析

Unturned游戏服务器在启动后不具有自动备份功能,一旦服务器出现问题,数据可能会丢失。为了避免这种情况,可以编写一个定时备份脚本,定期备份服务器数据。以下是一个示例备份脚本,可以根据实际情况进行修改和定制。

我大致需要实现以下功能:

  1. 每隔半小时备份一次/home/ubuntu/games/unturned/Servers/TestMyServerABC目录的所有内容(除了其中的Workshop和Backup子目录)
  2. 备份的位置放在/home/ubuntu/games/unturned/Servers/TestMyServerABC/Backup下
  3. 以时间命名备份后的目录:yyyy-mm-dd hh-mm-ss
  4. 最多备份5天的内容,允许产生的最大备份数量为5*48,超出则删除最早的

2. 创建备份脚本

创建备份脚本,/home/ubuntu/backup_script.sh

#!/bin/bash

echo "正在保存游戏数据"
# 定义screen会话名称
SCREEN_NAME="un"
# 打开指定名称的screen会话,并在其中执行save()命令
screen -S $SCREEN_NAME -X stuff "save\n"

sleep 10  # 延时 10 秒

# 备份源目录
SOURCE_DIR="/home/ubuntu/games/unturned/Servers/TestMyServerABC"

# 备份目标目录
BACKUP_DIR="$SOURCE_DIR/Backup"

# 当前时间戳,用于备份目录命名
TIMESTAMP=$(date +"%Y-%m-%d %H-%M-%S")

echo "正在备份存档到'$TIMESTAMP'"

# 创建备份目录
mkdir -p "$BACKUP_DIR/$TIMESTAMP"

# 复制文件,排除Workshop和Backup子目录
rsync -av --exclude 'Workshop' --exclude 'Backup' "$SOURCE_DIR/" "$BACKUP_DIR/$TIMESTAMP/"

echo "备份完成"

# 删除超过5天的备份
# 找到超过5天(5*48个备份)的备份目录并删除
MAX_BACKUPS=$((5*48))

cd "$BACKUP_DIR" || exit 1  # 确保目录切换成功

TOTAL_BACKUPS=$(ls -1d */ | wc -l)

if [ $TOTAL_BACKUPS -gt $MAX_BACKUPS ]; then
    # 删除最早的备份,保留最新的$MAX_BACKUPS个备份
    DELETE_COUNT=$((TOTAL_BACKUPS - MAX_BACKUPS))
    
    # 使用ls命令按创建时间排序并删除最早的目录
    # ls -1dt */ | tail -n "$DELETE_COUNT" | xargs -d '\n' rm -rf
    # 名称中有空格会导致删除失败
    ls -lt --time=ctime . | grep '^d' | tail -n "$DELETE_COUNT" | awk '{for(i=9;i<=NF;i++) printf "%s ", $i; print ""}' | sed 's/ *$//' | xargs -d '\n' -I {} rm -rf "{}"
    echo "删除$DELETE_COUNT个最早的备份文件"
fi
echo "end"

解释:

  1. Unturned存档变化不会立即写入磁盘,需要使用save命令触发存档写入。这里使用screen命令在screen会话中执行save命令。(这里假设已经使用screen启动了Unturned服务器)
  2. 使用rsync进行增量备份,–exclude参数用于排除Workshop和Backup子目录。 时间戳格式为yyyy-mm-dd hh-mm-ss,以便精确记录备份时间。
  3. ls -lt --time=ctime .命令按创建时间排序备份目录,删除最早的备份,保留最新的$MAX_BACKUPS个备份。如果备份目录中有空格,需要另外处理。

3. 添加定时任务

使用cron添加一个定时任务,每隔30分钟执行一次备份。

  1. 编辑cron任务
crontab -e

添加以下行,每30分钟运行一次备份脚本:

*/30 * * * * /home/ubuntu/backup_script.sh > /home/ubuntu/backup.log 2>&1
  1. 赋予执行权限
chmod +x /home/ubuntu/backup_script.sh