似乎少有关于 minecraft 自动备份的脚本,在此记录一下比较野鸡的方法。如果有更好的方法请告诉我!
MC开服一直都比较简单,以fabric为例只需要打开链接,选择好对应版本,然后下载即可。开服的指令网页里也准备好了,即 java -Xmx2G -jar XXX.jar nogui
那句指令。先运行一遍,会自动生成 eula.txt
文件,打开将里面的 false
改为 true
再重新输入开服指令即可。
先讲手工备份的方法。
有很多教程直接对 world
文件夹进行归档,然而这是存在一定的风险的,因为你在归档的同时服务器仍在运行,归档有可能是残缺的。
一个土办法是 关服-归档-再开服
,但是频繁的开服关服说实话很烦,不知道有没有人用。。。。。
正确的方法是输入服务端指令 /save-off
停止自动存档,接着 /save-all
保存所有内容,接着归档,再接着 /save-on
打开自动存档。
自动备份就是简单地对于手工备份过程的自动化,并没有太多难度。。。。?
然而仍然有一个问题困扰了我许久,就是如何在服务端后台运行的同时向其发送指令。不过后来我醒悟了,这个可以用命名管道来实现。
首先我们通过指令创建一个命名管道 mkfifo mc.fifo
,然后再将其通过管道传递给服务端,即将开服指令更改为
tail -f mc.fifo | java -Xmx2G -jar XXX.jar nogui > log.log
有了管道就可以自由地写脚本了,这里是我写的自动备份脚本,每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