Minecraft 开服记录 & 自动备份

  • Post author:
  • Post category:其他


似乎少有关于 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



版权声明:本文为onlytheworld原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。