Minecraftサーバ運営用の起動からバックアップ・再起動用コードを紹介します

  • 2014年10月14日
Minecraftサーバ運営用の起動からバックアップ・再起動用コードを紹介します

以前に作成したマインクラフトのサーバをVPSで運営していたときのコードになります。内容は単純でサーバを起動するシェル・サーバを再起動するシェル・マインクラフトをバックアップするシェルになっています。簡単なプログラムなので改良するところは多々多いと思いますが、普通に運営するだけなら楽になるので使ってみてください。

起動用コード

下記のコマンドを入力して起動用シェルスクリプトを作成します。このときにminecraft.jarまたはcraftbukkit.jarと同じ階層出作成してください。あとからmvコマンドで移動させてもいいよ。

vim start.sh

Vimコマンドで作成したら、以下のコマンドを記述します。

#!/bin/sh
export LANG='ja_JP.UTF-8'
export LC_ALL='ja_JP.UTF-8'
export LC_MESSAGES='ja_JP.UTF-8'

cd "${0%/*}"
screen -AmdS craftbukkit java -Xmx2048M -Xms1024M -jar craftbukkit.jar -o true

スクリーンで管理用コンソールを閲覧した場合に日本語が文字化けしないための対策で文字コードを宣言する。

export LANG='ja_JP.UTF-8'
export LC_ALL='ja_JP.UTF-8'
export LC_MESSAGES='ja_JP.UTF-8'

「craftbukkit」はファイル名を入力してください。「craftbukkit.jar」になっていた場合は「.jar」は除きます。次にヒープ領域を定義します。
ヒープ領域とは、動的に確保可能なメモリの領域のことで、最初に使用するメモリ領域と最大で使用するメモリ領域を双方向に定義します。「-Xms」は初期値のヒープ領域「-Xmx」は最大値のヒープ領域となります。メモリの確保と解放を繰り返すとメモリ領域がバラバラに分断されフラグメンテーションを引き起こし使用できるメモリが少なくなってしまうので、一定の期間で再起動が必要になります。
ここで宣言した値が使用可能なメモリ領域になります。

screen -AmdS craftbukkit java -Xmx2048M -Xms1024M -jar craftbukkit.jar -o true

データのバックアップ用コード

続いてバックアップ用ファイルを格納するディレクトリとバックアップ用
のシェルスクリプトも作成。

mkdir backups
vim backup.sh

「backup.sh」には以下の内容を記述します。

 #!/bin/bash
backup_filename=`date '+%m-%d-%Y-%H%M%S'`"_world"
tar -cvzf backups/$backup_filename.tar.gz world

backup_filename2=`date '+%m-%d-%Y-%H%M%S'`"_nether"
tar -cvzf backups/$backup_filename2.tar.gz world_nether

簡単に解説すると、「world」データを現在の日付時間分秒に「_world」を付け「tar.gz」に圧縮して保存します。「nether」の方も同様です。「backup.sh」は次で紹介する「restart.sh」でリスタートと同時に起動するように設定します。

backup_filename=`date '+%m-%d-%Y-%H%M%S'`"_world"
tar -cvzf backups/$backup_filename.tar.gz world

再起動用のコード

同様にファイルを作成します。

vim restart.sh

作成した「restart.sh」に下記のコードを記述します。

#!/bin/sh
export LANG='ja_JP.UTF-8'
export LC_ALL='ja_JP.UTF-8'
export LC_MESSAGES='ja_JP.UTF-8'

BACKUPSCRIPT=backup.sh
STARTSCRIPT=start.sh
SCREEN_NAME=craftbukkit
i=60
cd "${0%/*}"
while [ ${i} -ne 0 ]
do
    if test `expr ${i} % 30` -eq 0 -o ${i} -le 10
    then
        screen -S ${SCREEN_NAME} -p 0 -X eval "stuff say\040秒後にサーバを再起動します\040${i}\040秒\015"
    fi
    i=`expr ${i} - 1`
    sleep 1
done
screen -S ${SCREEN_NAME} -p 0 -X eval 'stuff stop\015'
sleep 10
./${BACKUPSCRIPT}
sleep 10
./${STARTSCRIPT}

最初に文字化け対策を施したあと、いくつかの変数を宣言しています。
「BACKUPSCRIPT」はバックアップ用シェルスクリプトのファイル名
「STARTSCRIPT」は起動用シェルスクリプト名
「SCREEN_NAME」はスクリーン実行名
「i=60」はループカウンタでここでは「60秒」をカウントして再起動用のスクリプトを実行してから、60秒後に再起動するように設定してあります。2分に設定したい場合は60を120と変更してください。

BACKUPSCRIPT=backup.sh
STARTSCRIPT=start.sh
SCREEN_NAME=craftbukkit
i=60

仕様としては、60秒前から10秒ごとにカウントダウンして、10秒からは1秒ごとにカウントダウンしてworldをセーブし、minecraftを停止、バックアップを作成、再起動する仕組みになっています。