最近开了个我的世界基岩版的服务器团建用,由于不能保证每个用户都是那么善良,所以有自动备份世界的需要。

  MC 服务器本身提供了在 console 中通过指令备份世界,但由于我是用nohup命令启动的,又因为本人是条咸鱼,懒得去研究如何向nohup运行的应用做标准输入(stdin),所以就选择了在夜深人静的时候 kill 掉服务器,手动打包再重新启动服务器。

  通过上面的思路,分为两个大模块:脚本和定时执行。

1 脚本

1.1 找到并杀死服务器进程

# 获取 bedrock_server 进程的 pid
ID=`ps -ef | grep bedrock_server | grep -v grep | awk '{print $2}'`
# 杀死进程
for id in $ID
do
kill -9 $id
done

1.2 打包备份世界

  通过观察目录结构可以知道,世界都被存储在 worlds 目录下,所以只需要将整个 worlds 目录打包即可。

# 创建一个备份文件夹
if [ ! -d "backups" ]
then
mkdir backups
fi
# 获取当前时间并创建备份
time=$(date +%Y-%m-%d_%H-%M-%S)
tar -zcvf ./backups/worlds-${time}.tar worlds

1.3 启动服务器

# 此处即使在root用户下如果不用sudo也会报命令找不到
nohup sudo LD_LIBRARY_PATH=. ./bedrock_server &

1.4 脚本整合

time=$(date +%Y-%m-%d_%H-%M-%S)
cd /root/bedrock-server

# find bedrock_server process and kill
ID=`ps -ef | grep bedrock_server | grep -v grep | awk '{print $2}'`
for id in $ID
do
kill -9 $id
done

# create backup dir
if [ ! -d "backups" ]
then
mkdir backups
fi

# create backup
tar -zcvf ./backups/worlds-${time}.tar worlds

# start server
nohup sudo LD_LIBRARY_PATH=. ./bedrock_server &

2 定时执行

  定时执行通过系统自带 crontab 即可,正则表达式可以通过网上的工具生成。