【minecraftサーバ】MOD・プラグイン不要!!自動バックアップ+再起動システム

#シェルによるバックアップシステム
Minecraftのサーバを運営していて
定期的にバックアップと再起動をしたいと思って作りました。

minecraft内での処理ではなくシェルスクリプトを使いOS側から操作することにより
MODやプラグイン無しでも動作します。

自分のために忘れないように記事にします

※あくまで自忘禄です。これにより不具合やトラブルが発生しても、当方責任は取りません。

##条件
この記事では以下の条件での作成をしています。
>- Linuxサーバーであること。(Windowsでもbatを使えばおそらく可能)
- Forge ServerでもBukkit Serverでも問題ありません。
- **全てのバージョンに対応**しています

※この記事はCentOS7向けに書いております。
　他でもおそらく可能ですが、コマンドが一部違う部分があると思うので、置き換えてください。

##事前準備
サーバーのプロセスを`screen`環境で動かしていた方が何かと都合がいいので`screen`が入っていない場合はインストールをします。

```
# yum -y install screen
```
rootユーザかsudoで実行してください。

次にバックアップデータを保存しておくディレクトリを作ります。
場所及びディレクトリ名は自由です。(Minecraftサーバのworldディレクトリ内だけ避けてください)

```
$ mkdir backup
```

##シェルスクリプト
今回のメインとなるプログラムです。
まずは自分の好きな場所にシェルを作りましょう。
以下マイクラサーバと同じユーザで行ってください。
[viエディタの使い方](https://qiita.com/pe-ta/items/0510bee10bcfd88afeee)

```
$ vi backup.sh
```
↓コピペ↓(※ファイルのパスだけ書き換え必要)

```bash:backup.sh

#!/bin/bash
#
#マイクラのバックアップ自動作成スクリプト

#######ゲーム中の人のためにメッセージを送ります。#######
time1=60 #この数字をいじることで再起動までの時間を調整可能
screen -S minecraft -X stuff 'say §a§l§n自動アナウンス'`echo -ne '\015'`
screen -S minecraft -X stuff 'say §b'$time1'§秒後に§lバックアップ§6及び§l再起動§6を行います。'`echo -ne '\015'`
time2=`expr $time1 - 10`
sleep `expr $time2`
screen -S minecraft -X stuff 'say §cまもなくサーバーが自動停止します。'`echo -ne '\015'`
sleep 10
screen -S minecraft -X stuff 'stop'`echo -ne '\015'` #minecraft終了

########## minecarftが完全に終了するまで待機 ##########
#javaのプロセス数を数えてるため
#ほかにjavaを動かしていたら調整してください
count1=`ps -ef | grep java | grep -v grep | wc -l`
while :
do
    if [ $count1 = 0 ] ; then
        break
    else
        sleep 0.5
        count1=`ps -ef | grep java | grep -v grep | wc -l`
    fi
done


############## バックアップ開始 #################
#ワールドディレクトリのコピー
cp マイクラのパス/world バックアップディレクトリのパス/backup

#zipに圧縮
zip バックアップディレクトリのパス/backup/world バックアップディレクトリのパス/backup

#ファイル名に日付を付ける
cp -aiv バックアップディレクトリのパス/backup/world.zip バックアップディレクトリのパス/backup/world.`date "+%Y%m%d_%H%M"`.zip

#いらないものを消す
rm -rf バックアップディレクトリのパス/backup/world
rm バックアップディレクトリのパス/backup/world.zip

############# minecraft再起動 ##############
screen -S minecraft -X stuff 'java -Xmx4096M -Xms1024M -jar  サーバーjarの絶対パス(例/home/User/Minecraft/server.jar) nogui'`echo -ne '\015'`
#javaの引数は任意
```

細かな調整は各自お願いします。

実行できるように権限を付与します

```
$ chmod 744 backup.sh
```

##サーバーの起動

コマンドを送ったりする関係上**サーバはscreen上で起動します。**←ここ重要
screenは仮想デスクトップみたいなものです。
minecraftという名前のscreenを起動します。

```
$ screen -S minecraft
```
既にminecraftというscreenが起動している場合はアタッチします。

```
$ screen -r minecraft
```

screen内でMinecraft Serverを実行します。
シェルからでもコマンドからでも
↓コマンドの場合

```
$ cd マイクラサーバのパス
$ java -Xmx4096M -Xms1024M -jar server.jar nogui
```

これでサーバーがいつも通り起動すると思うのでデタッチします。
>`Ctrlキー` + `aキー`を押した後に`dキー`を押す。

するとLinuxのコマンドラインに戻ってきますが、裏ではマイクラのサーバが動いています。
**マイクラのコンソールに戻りたいときは上記のアタッチをしてください**

##バックアップの実行
screenをデタッチした状態でシェルを実行します。

```
$ ./backup.sh
```
マイクラ内にメッセージが出現して
自動停止→バックアップ→自動起動が行われれば成功です。
![2020-08-18_19.43.42_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551197/6fef22cb-270e-ce7d-4366-c8e9ecc854d4.jpeg)
このようにバックファイルデータが作成されます。
![コメント 2020-08-18 195033.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551197/bab7579d-a0c4-fd60-245c-987a16718e2e.jpeg)
バックアップの復旧はzipを解凍後worldディレクトリと置き換えてください。

以上で終了です。
お疲れさまでした。


#応用編
###24時間サーバー向け　定時実行
毎日一定の時間に自動実行することが可能です。
そのために`cron`を使用します。

CentOSには既にcronが入っているはずですが、入っていなかったらインストールします。

```
# yum -y install crontabs
```

クーロンを作成します。マイクラサーバと同じユーザで行ってください

```
$ crontab -e
```

viエディタが起動します
以下例です。
例えば、AM6:00とPM4時に実行かけたかったとすると

```:crontab
0 6,16 * * * /home/User/backup.sh(backup.shの絶対パス)
```
と、記述します。
詳しくは[こちらの記事](https://qiita.com/katsukii/items/d5f90a6e4592d1414f99)が優良なのでご覧ください。