在ConoHa VPS上搭建Minecraft服务器的经历(包括备份和操作系统重启)
上次的故事 huí de huà)
上一次的文章主要介绍了如何在操作系统启动时通过Systemd自动启动Minecraft服务器的服务。
关于这次
这次是接着上次的话题,我们已经实现了自动启动我的世界服务器服务,现在想要实现自动备份和定期自动重启数据。
顺便提一下,操作系统重启是在备份的时候完成的(反正为了备份已经停止了服务器服务,也顺便释放一下内存)。
因为这次的设置有些基于上次的设定,所以如果还没看过上次的文章的话,建议你也先看一下。给未来的我也留个备忘。
我想要创建一个能够进行备份/操作系统重新启动的Shell。
やりたいこと
バックアップ実行前にサーバー内に向けて指定時間後に再起動がされることを通知
直前のカウントダウン
サーバーサービスを停止してバックアップ
過去5日分くらいバックアップがあればいいので5日以降のバックアップデータを削除
バックアップが完了したらOSごとreboot
1-1. 必需的文件 (bì xū de
バックアップ実行前にサーバー内に向けて指定時間後に再起動がされることを通知
直前のカウントダウン
サーバーサービスを停止してバックアップ
過去5日分くらいバックアップがあればいいので5日以降のバックアップデータを削除
バックアップが完了したらOSごとreboot
所以,我用Shell编写了数据备份和重启处理。以下是参考自该网站的”自动重启”代码。
-
Minecraftサーバをscreenとcronでプラグインを使わずに自動再起動する
「 https://jyn.jp/minecraft-server-auto-restart/ 」
1-2. ~~~。sh文件中的内容
#!/bin/bash
# screenのソケット名
SCREEN_NAME='minecraft'
# サーバ終了までの待ち時間
WAIT=60
# バックアップデータの保存期間
STORAGE_PERIOD=+5
# バックアップ先
BACKUP_DIR=/var/games/minecraft_backup
# カウントダウンの秒数
COUNT=10
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say '${WAIT}'秒後にサーバーを再起動します。\015"'
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say '${WAIT}'秒後自動でキックされます。\015"'
# カウントダウンがあるのでCOUNTで指定した秒数マイナスしただけsleep
sleep $(($WAIT - $COUNT))
# 10秒のカウントダウン
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 停止まで―\015"'
for ((i=$COUNT; i>0; i--));
do
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say '${i}'\015"'
sleep 1
done
# 停止前に全プレイヤーをキックする
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "kick @a サーバーを再起動します。バックアップ及び起動に3~5分かかります。 \015"'
# サービス停止
systemctl stop minecraftserver.service
# マイクラサーバーデータのバックアップフォルダへ移動
cd ${BACKUP_DIR}
# ファイル名(日時)
DIR=`date '+%Y%m%d_%H%M'`
# データをtar.gzへ圧縮
tar -zcvf $DIR.tar.gz -C /usr/local/games minecraft
# バックアップフォルダからSTORAGE_PERIODで指定した日数以上前のデータを削除
find ${BACKUP_DIR} -maxdepth 1 -mtime ${STORAGE_PERIOD} -name '*.tar.gz' -exec rm -f {} \;
# サービスの再起動だけでいいのなら以下のコメントを解除
# systemctl restart minecraftserver.service
# sudo権限で再起動
sudo reboot
因みに、変数について一応補足。
※興味なければ次のステップへ。
変数
概要
備考
SCREEN_NAME
サーバーサービスを実行しているscreenのソケット名。このソケット名のscreenにアタッチするための変数。
前回の記事でSystemdにサーバーサービス登録した時に、screenのソケット名を「minecraft」としているので上記の通りにしている。
WAIT
サーバを停止するまでの待ち時間。
ここをお好みで変えることで90秒でも120秒でも待ち時間が設定できる。
今回は参考サイトと同様に60秒の待ち時間を設定した。
STORAGE_PERIOD
バックアップデータの保存日数。ここに指定した日数以上前のファイルは削除するための設定。
今回のバックアップは毎日やるつもりなので過去5日分のデータを保管するようにしている。自分のサーバーのストレージと相談して3日や4日と変更してあげると良い。例:「STORAGE_PERIOD=+3」過去3日保存の場合
BACKUP_DIR
マイクラサーバデータのバックアップ先ディレクトリ。
今回はこんな感じのところにディレクトリを作った。「/var/games/minecraft_backup」お好みで好きなところにbackupディレクトリを作ってもらえればと思う。
COUNT
カウントダウン開始の秒数。
今回は簡単に10秒とした。実際やるならWAITを180にしてCOUNTを30とかにするかな。
データの圧縮処理・バックアップについて(以下sh内容参照)
※ここも興味なければ次のステップへ。
今回は圧縮元を「/usr/local/games」にある「minecraft」ディレクトリ対象にを丸ごと圧縮してるけど、普通にワールドデータだけでいいならこのディレクトリの下のworldをバックアップ先にすると良いと思う。
バックアップを重ねれば意外とデータも容量食うので、3日前くらいのデータだけ残ってればいいって人は前述の表のとおり、「STORAGE_PERIOD」の値を「+2」とか「+3」にすればいいと思う。
# データをtar.gzへ圧縮
tar -zcvf $DIR.tar.gz -C /usr/local/games minecraft
# バックアップフォルダからSTORAGE_PERIODで指定した日数以上前のデータを削除
find ${BACKUP_DIR} -maxdepth 1 -mtime ${STORAGE_PERIOD} -name '*.tar.gz' -exec rm -f {} \;
バックアップ後のサービス起動について
コメントアウトでも書いてあるけど、OSの再起動までは別にしなくていいって人は以下のようにコメントアウトを外して有効化すればまたマイクラサーバサービスが起動する。
# サービスの再起動だけでいいのなら以下のコメントを解除
systemctl restart minecraftserver.service
1-3. 运行测试
完成后,尝试使用sh命令来执行。(将文件名改为你自己的脚本文件名并执行。)
# sh restart.sh
如果一切顺利的话,我认为在“/usr/local/games/minecraft/logs”文件夹中的服务器日志将会以这样的方式显示。
[23:29:01] [Server thread/INFO]: [Server] 60秒後にサーバーを再起動します。
[23:29:01] [Server thread/INFO]: [Server] 60秒後自動でキックされます。
[23:29:51] [Server thread/INFO]: [Server] 停止まで―
[23:29:51] [Server thread/INFO]: [Server] 10
[23:29:52] [Server thread/INFO]: [Server] 9
[23:29:53] [Server thread/INFO]: [Server] 8
[23:29:54] [Server thread/INFO]: [Server] 7
[23:29:55] [Server thread/INFO]: [Server] 6
[23:29:56] [Server thread/INFO]: [Server] 5
[23:29:57] [Server thread/INFO]: [Server] 4
[23:29:58] [Server thread/INFO]: [Server] 3
[23:29:59] [Server thread/INFO]: [Server] 2
[23:30:00] [Server thread/INFO]: [Server] 1
[23:30:01] [Server console handler/ERROR]: Exception handling console input
java.io.IOException: Input/output error
at java.io.FileInputStream.readBytes(Native Method) ~[?:?]
at java.io.FileInputStream.read(FileInputStream.java:276) ~[?:?]
只需要一种选择,以下确认一下备份的位置,如果数据已经创建就好。
# ll /var/games/minecraft_backup/
total 1053352
-rw-r--r-- 1 root root 1078626900 Mar 14 23:31 20220314_2330.tar.gz
每天想要自動執行已完成的脚本。
好了,现在终于可以进行数据备份和操作系统重启了。
所以接下来我希望每天都能做这个。
使用crontab进行定期执行
这次我使用了”crontab”。
crontab没有问题吧?没有不行的吧?请有见识的人告诉我一下。
在中文中以一种方式改写:
crontab的设置可以通过以下命令完成。
※一个常见的错误是尝试执行”crontab -e”时错误地输入为”crontab -r”。要注意,如果执行此命令,定期执行的设置将被删除。
# crontab -e
然后编辑页面就打开了,我按照以下设置。
请在“/etc/restart.sh”部分写上自己创建的文件位置和文件名。
0 4 * * * /etc/restart.sh > /dev/null 2>&1
如果需要补充一些设定值的话,
“0 4 * * *” 从左到右分别代表着 “分钟,小时,日期,月份,星期几”。
“*” 代表每次执行。
因此在这个情况下,意思是每天的凌晨4点整执行 “/etc/restart.sh”。
“> /dev/null 2>&1” 可以看作是一个魔法词,如果你感到好奇,可以随时去查阅。
2-2. 等待而已
只需等待。
直到设定的时间到来为止,请耐心等待。
如果自动执行了,第二天检查应该已经生成了备份文件,并且服务器服务也应该已经启动。
要确认服务是否已经启动,可以使用”systemctl status”或其他命令来检查。然后可以尝试直接启动Minecraft并登录。
在”/usr/local/games/minecraft/logs”中也可以找到以前的Minecraft服务器日志,可以进行确认。
目前备份和操作系统重新启动已经完成。
辛苦了。
最后
因为前一次和这一次都是根据一股势头进行设置的,所以也许这个设定没有必要吧?总之,只是想让其他人尝试一试或者作为参考的娱乐罢了,所以请改进不满意的地方……
暫時來說,這次是關於興趣周圍的對話,也許可以說是像對待興趣的人一樣的程度設定吧,不過和工作不同,只做了想要的設定,所以很開心。(小學生般的感受)
以上、辛苦了。
#!/bin/bash
# screenのソケット名
SCREEN_NAME='minecraft'
# サーバ終了までの待ち時間
WAIT=60
# バックアップデータの保存期間
STORAGE_PERIOD=+5
# バックアップ先
BACKUP_DIR=/var/games/minecraft_backup
# カウントダウンの秒数
COUNT=10
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say '${WAIT}'秒後にサーバーを再起動します。\015"'
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say '${WAIT}'秒後自動でキックされます。\015"'
# カウントダウンがあるのでCOUNTで指定した秒数マイナスしただけsleep
sleep $(($WAIT - $COUNT))
# 10秒のカウントダウン
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 停止まで―\015"'
for ((i=$COUNT; i>0; i--));
do
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say '${i}'\015"'
sleep 1
done
# 停止前に全プレイヤーをキックする
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "kick @a サーバーを再起動します。バックアップ及び起動に3~5分かかります。 \015"'
# サービス停止
systemctl stop minecraftserver.service
# マイクラサーバーデータのバックアップフォルダへ移動
cd ${BACKUP_DIR}
# ファイル名(日時)
DIR=`date '+%Y%m%d_%H%M'`
# データをtar.gzへ圧縮
tar -zcvf $DIR.tar.gz -C /usr/local/games minecraft
# バックアップフォルダからSTORAGE_PERIODで指定した日数以上前のデータを削除
find ${BACKUP_DIR} -maxdepth 1 -mtime ${STORAGE_PERIOD} -name '*.tar.gz' -exec rm -f {} \;
# サービスの再起動だけでいいのなら以下のコメントを解除
# systemctl restart minecraftserver.service
# sudo権限で再起動
sudo reboot
※興味なければ次のステップへ。
ここをお好みで変えることで90秒でも120秒でも待ち時間が設定できる。
-
データの圧縮処理・バックアップについて(以下sh内容参照)
※ここも興味なければ次のステップへ。
今回は圧縮元を「/usr/local/games」にある「minecraft」ディレクトリ対象にを丸ごと圧縮してるけど、普通にワールドデータだけでいいならこのディレクトリの下のworldをバックアップ先にすると良いと思う。
バックアップを重ねれば意外とデータも容量食うので、3日前くらいのデータだけ残ってればいいって人は前述の表のとおり、「STORAGE_PERIOD」の値を「+2」とか「+3」にすればいいと思う。
# データをtar.gzへ圧縮
tar -zcvf $DIR.tar.gz -C /usr/local/games minecraft
# バックアップフォルダからSTORAGE_PERIODで指定した日数以上前のデータを削除
find ${BACKUP_DIR} -maxdepth 1 -mtime ${STORAGE_PERIOD} -name '*.tar.gz' -exec rm -f {} \;
-
バックアップ後のサービス起動について
コメントアウトでも書いてあるけど、OSの再起動までは別にしなくていいって人は以下のようにコメントアウトを外して有効化すればまたマイクラサーバサービスが起動する。
# サービスの再起動だけでいいのなら以下のコメントを解除
systemctl restart minecraftserver.service
1-3. 运行测试
完成后,尝试使用sh命令来执行。(将文件名改为你自己的脚本文件名并执行。)
# sh restart.sh
如果一切顺利的话,我认为在“/usr/local/games/minecraft/logs”文件夹中的服务器日志将会以这样的方式显示。
[23:29:01] [Server thread/INFO]: [Server] 60秒後にサーバーを再起動します。
[23:29:01] [Server thread/INFO]: [Server] 60秒後自動でキックされます。
[23:29:51] [Server thread/INFO]: [Server] 停止まで―
[23:29:51] [Server thread/INFO]: [Server] 10
[23:29:52] [Server thread/INFO]: [Server] 9
[23:29:53] [Server thread/INFO]: [Server] 8
[23:29:54] [Server thread/INFO]: [Server] 7
[23:29:55] [Server thread/INFO]: [Server] 6
[23:29:56] [Server thread/INFO]: [Server] 5
[23:29:57] [Server thread/INFO]: [Server] 4
[23:29:58] [Server thread/INFO]: [Server] 3
[23:29:59] [Server thread/INFO]: [Server] 2
[23:30:00] [Server thread/INFO]: [Server] 1
[23:30:01] [Server console handler/ERROR]: Exception handling console input
java.io.IOException: Input/output error
at java.io.FileInputStream.readBytes(Native Method) ~[?:?]
at java.io.FileInputStream.read(FileInputStream.java:276) ~[?:?]
只需要一种选择,以下确认一下备份的位置,如果数据已经创建就好。
# ll /var/games/minecraft_backup/
total 1053352
-rw-r--r-- 1 root root 1078626900 Mar 14 23:31 20220314_2330.tar.gz
每天想要自動執行已完成的脚本。
好了,现在终于可以进行数据备份和操作系统重启了。
所以接下来我希望每天都能做这个。
使用crontab进行定期执行
这次我使用了”crontab”。
crontab没有问题吧?没有不行的吧?请有见识的人告诉我一下。
在中文中以一种方式改写:
crontab的设置可以通过以下命令完成。
※一个常见的错误是尝试执行”crontab -e”时错误地输入为”crontab -r”。要注意,如果执行此命令,定期执行的设置将被删除。
# crontab -e
然后编辑页面就打开了,我按照以下设置。
请在“/etc/restart.sh”部分写上自己创建的文件位置和文件名。
0 4 * * * /etc/restart.sh > /dev/null 2>&1
如果需要补充一些设定值的话,
“0 4 * * *” 从左到右分别代表着 “分钟,小时,日期,月份,星期几”。
“*” 代表每次执行。
因此在这个情况下,意思是每天的凌晨4点整执行 “/etc/restart.sh”。
“> /dev/null 2>&1” 可以看作是一个魔法词,如果你感到好奇,可以随时去查阅。
2-2. 等待而已
只需等待。
直到设定的时间到来为止,请耐心等待。
如果自动执行了,第二天检查应该已经生成了备份文件,并且服务器服务也应该已经启动。
要确认服务是否已经启动,可以使用”systemctl status”或其他命令来检查。然后可以尝试直接启动Minecraft并登录。
在”/usr/local/games/minecraft/logs”中也可以找到以前的Minecraft服务器日志,可以进行确认。
目前备份和操作系统重新启动已经完成。
辛苦了。
最后
因为前一次和这一次都是根据一股势头进行设置的,所以也许这个设定没有必要吧?总之,只是想让其他人尝试一试或者作为参考的娱乐罢了,所以请改进不满意的地方……
暫時來說,這次是關於興趣周圍的對話,也許可以說是像對待興趣的人一樣的程度設定吧,不過和工作不同,只做了想要的設定,所以很開心。(小學生般的感受)
以上、辛苦了。