Minecraft 开服记录 & 自动备份

李振国
2023-12-01

似乎少有关于 minecraft 自动备份的脚本,在此记录一下比较野鸡的方法。如果有更好的方法请告诉我!

一、开服

MC开服一直都比较简单,以fabric为例只需要打开链接,选择好对应版本,然后下载即可。开服的指令网页里也准备好了,即 java -Xmx2G -jar XXX.jar nogui 那句指令。先运行一遍,会自动生成 eula.txt 文件,打开将里面的 false 改为 true 再重新输入开服指令即可。

二、自动备份

2.1 手工备份

先讲手工备份的方法。

有很多教程直接对 world 文件夹进行归档,然而这是存在一定的风险的,因为你在归档的同时服务器仍在运行,归档有可能是残缺的。

一个土办法是 关服-归档-再开服,但是频繁的开服关服说实话很烦,不知道有没有人用。。。。。

正确的方法是输入服务端指令 /save-off 停止自动存档,接着 /save-all 保存所有内容,接着归档,再接着 /save-on 打开自动存档。

自动备份就是简单地对于手工备份过程的自动化,并没有太多难度。。。。?

2.2 命名管道

然而仍然有一个问题困扰了我许久,就是如何在服务端后台运行的同时向其发送指令。不过后来我醒悟了,这个可以用命名管道来实现。

首先我们通过指令创建一个命名管道 mkfifo mc.fifo,然后再将其通过管道传递给服务端,即将开服指令更改为

tail -f mc.fifo | java -Xmx2G -jar XXX.jar nogui > log.log

2.3 自动脚本

有了管道就可以自由地写脚本了,这里是我写的自动备份脚本,每5分钟检测一次服务器是否有人,有人时每20分钟自动备份一次。代码非常简单就不详细介绍了。
backup.sh

mkdir backup
backup_num=10 #保留10个备份
savestate=0
while true; do
    sleep 5m #每五分钟检查一次是否有人
    echo "list" >mc.fifo
    latest=$(tail -1 log.log)
    if [[ ${latest:33:11} == "There are 0" ]]; then
        haspeople=0
    else
        haspeople=1
        savestate=1
        echo "say Start auto-backup service" >mc.fifo
    fi
    if [ $savestate -eq 1 ]; then
        {
            echo "say Begin Backup"
            echo save-off
            echo save-all
            tar -cf backup/$(date +%Y%m%d_%H%M%S).tar.gz world
            echo save-on
            echo "say Backup Completed"
        } >mc.fifo #一次备份
        cd backup
        dir_num=$(ls -l | wc -l)
        if [ $dir_num -gt $backup_num ]; then #删除过旧的备份
            num=$(expr $dir_num - $backup_num)
            ls -tr | head -$num | xargs -i -n1 rm {}
        fi
	    cd ..
	    if [ $haspeople -eq 0 ]; then #若没人则停止备份
            savestate=0
            echo "say Stop auto-backup service since no player" >mc.fifo
        fi
        sleep 15m #每次备份至少间隔 20分钟
    fi
done
 类似资料: