なうびるどいんぐ

脳みそ常時-3dB

Minecraftサーバをscreenとcronでプラグインを使わずに自動再起動する

      2018/05/09    HimaJyun

先日投稿した「これからマイクラ鯖を建てたい人に言いたい事
この中で「自動再起動させましょう」と言いましたが、やり方が分からない人の方が多いと思うので僕のやり方をご紹介します。

スポンサーリンク

最初に

僕の方法ではプラグインを使わず、Linuxに標準搭載されているscreenとcronで実現しているため、必然的にLinuxでの手法となります。
ただ、「これからマイクラ鯖を建てたい人に言いたい事」で説明した通り、僕はサーバの運営はLinuxでやる事を強くおススメしています、これを機にLinuxサーバへの移行も検討してみて下さい。

ついでにscreenとcronとは何かも説明しておきますね。

screen

screenは仮想のCUIを作成出来るコマンドです。

LinuxのCUIは1度に1つずつしか作業できないため、時間の掛かる処理を実行するとその処理が終わるまで他の事が出来ません。
例えばですが、「sleep 60」を実行すると60秒、すなわち1分は他の事が出来なくなります。

でもって、マイクラ鯖は処理の終了=サーバの終了になります。
つまり、マイクラ鯖を起動すると、その起動した鯖を止めない限りは他の事が出来なくなります。

そこで登場するのがscreenです、screenでマイクラ鯖を起動すると鯖そのものはscreen内で実行されるため、問題無く他の作業が可能です。

Ubuntuの場合はデフォルトでインストールされていると思いますが、もしインストールされていない場合は「apt-get install screen」でインストールしましょう。

cron

cron(ctontab)はUnix系OSに搭載されている設定したコマンドを定期的に実行する機能です。
自動バックアップなどを実現させる際に使うかと思われます。

マイクラ鯖をscreenで起動する

当然ですが、screenの機能を使って実現するためにはマイクラ鯖をscreenで起動する必要があります。
とは言え、どの記事を見てもscreen起動してるので今更説明の必要は無いかも知れませんが一応説明しておきます。

サーバの起動コマンド「java ~~~~」の前にscreenを付けるだけですが、色々ややこしいため僕が使っている起動スクリプト(start.sh)をご紹介します。

#!/bin/bash
# サーバのJARファイル
JARFILE=/mnt/ramdisk/minecraft_server.jar

# サーバに割り当てるメモリ
MEM=8G

# GCを実行するスレッド数、コア数と同じで
GCTHREADS=4

cd `dirname $0`
screen -UAmdS minecraft java -server -Xms${MEM} -Xmx${MEM} -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:+DisableExplicitGC -XX:+UseCompressedOops -XX:+OptimizeStringConcat -XX:+UseTLAB -XX:ParallelGCThreads=${GCTHREADS} -jar ${JARFILE} nogui

スクリプトを実行可能(chmod 777 /スクリプトがあるディレクトリ/start.sh)にしてから、このファイルを実行すればサーバがscreenで起動します。

自動再起動

screenでコマンドを送るだけなのですが、面倒なのでこちらもスクリプト(restart.sh)をご用意しました。

#!/bin/bash

# === 設定 ===
# サーバ終了までの待ち時間
WAIT=60
# サーバ起動スクリプト
STARTSCRIPT=/mnt/ramdisk/server.sh
# screenの名前
SCREEN_NAME='minecraft'
# ============

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say '${WAIT}'秒後にサーバーを再起動します\015"'
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say すぐに再接続可能になるので、しばらくお待ち下さい\015"'

sleep $WAIT
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "stop\015"'
# バックアップなどを停止中に行いたい場合はこの中に記載 ->

# rsync -a --delete /mnt/ramdisk/ /mnt/ramsave/

# <- バックアップなどを停止中に行いたい場合はこの中に記載

# screen -listの結果から${SCREEN_NAME}が含まれるものを抽出し、空になるまでループ(結果、全て終了するまで待つ事になる)
while [ -n "$(screen -list | grep -o "${SCREEN_NAME}")" ]
do
  # 空回り防止
  sleep 1
done

$STARTSCRIPT

スクリプトを実行可能(chmod +x /スクリプトがあるディレクトリ/restart.sh)にしておいて下さいね。

cronで定期的に実行する

後はcronで定期的に実行するだけです。
「crontab -e」でcrontabの編集画面が開くので以下を参考に追記して下さい。

0 4 * * * /スクリプトがあるディレクトリ/restart.sh > /dev/null 2>&1

(上の例では「> /dev/null 2>&1」でログを捨てていますが、実際はどこかに保存しておいた方が良いです)

「0 4 * * *」は左から順に「分,時,日,月,曜日」で、「*」は毎回を表します。この場合は「毎日4時0分に再起動する」と言う指定になります。

これでサーバを自動的に再起動する事が出来ます。
サーバを定期的に再起動するのは安定した動作を実現するためには必須なのでぜひ再起動させてやってください。

 - サーバー