CentOS7 + Systemd でMinecraftサーバーの起動/自動起動/自動再起動


# はじめに
Minecraftサーバーって急に落ちたりしますよね！？
そのたびにSSHで入って起動し直すのはだるい！

デーモン化はどうしてますか？
Screen？？

もっといい方法がありますよ！ :innocent: 

簡単にMinecraftサーバーをいい感じに運用できるようにする方法を紹介します。

# Systemdとは？
今回Systemdというものを使ってMinecraftサーバーを起動するようにします。
Systemdは簡単にいうとLinuxを起動するための仕組みです。
デーモン化や急に落ちた時の自動再起動、OS立ち上げた時の自動起動、ログ記録なんでもよろしくやってくれます。

CentOS 7から使えるようになっています。

# Minecraftサーバーの構築
CentOS 7でのMinecraftサーバーの構築はこちらの記事を参考にしてください。

* [IDCFクラウドでMinecraftサーバを構築しよう！](http://qiita.com/blueberryt/items/3d79e9ff204737da9455)
* [さくらのVPSでminecraftマルチプレイヤサーバを構築 OSインストール](http://www.server-memo.net/minecraft/mc-install/minecraftserver-3.html)

`minecraft`ユーザのホームディレクトリ以下にjarファイルがあり、`minecraft`ユーザでサーバーを起動するという前提で説明します。

```bash
[minecraft@mctest ~]$ id
uid=1000(minecraft) gid=1000(minecraft) groups=1000(minecraft)
[minecraft@mctest ~]$ tree .
.
└── minecraft
    ├── minecraft_server.1.8.8.jar
    └── minecraft_server.jar

1 directory, 2 files
```

# 起動スクリプト作成
`/home/minecraft/minecraft/boot`に起動用のスクリプトを作成します。
`minecraft`ユーザーで作業してください。

```bash
vi ~/minecraft/boot
```

スクリプトの中身は次のようになります。たった1行です！
ヒープメモリのサイズを環境変数で指定できるようになっています。

```bash:~/minecraft/boot
#!/bin/bash

java -Xms$XMS_SIZE -Xmx$XMX_SIZE -jar $HOME/minecraft/minecraft_server.jar nogui
```

最後にこのスクリプトに実行権限を与えます。

```bash
chmod +x ~/minecraft/boot
```

# 環境変数定義ファイル作成
ではヒープメモリサイズの環境変数を定義するファイルを`/home/minecraft/minecraft/environments`に作成します。
こちらも`minecraft`ユーザーで作業してください。

```bash
vi ~/minecraft/environments
```

中身はこんな感じ。わかりやすいですね！

```bash:~/minecraft/environments
# ヒープメモリの初期サイズ
XMS_SIZE=1024M

# ヒープメモリの最大サイズ
XMX_SIZE=1024M
```

以降はここを書き換えるとメモリサイズを調整することができます。

# unitファイル作成
最後にSystemdのUnitファイルというものを作成します。
これは`root`ユーザーで作業してください。

```bash
vi /etc/systemd/system/minecraft_server.service
```

中身はこんな感じになります。
詳しくは説明しませんが単純なのでなんとな〜くわかっていただけるかと思います。
`Restart=always`が落ちたら自動で再起動するオプションです。

```:/etc/systemd/system/minecraft_server.service
[Unit]
Description=Minecraft Server
After=network-online.target

[Service]
ExecStart=/bin/bash /home/minecraft/minecraft/boot
EnvironmentFile=/home/minecraft/minecraft/environments
WorkingDirectory=/home/minecraft/minecraft
Restart=always
User=minecraft
Group=minecraft

[Install]
WantedBy=multi-user.target
```

ファイルを作成したら、Systemdからこのファイルを読み込みます。

```bash
systemctl daemon-reload
```

OSが起動した時にMinecraftサーバーも起動するように自動起動を有効にしておきます。

```bash
systemctl enable minecraft_server
```

# 起動
いよいよ起動します！
systemdを使った起動は次のコマンドでできます。

```bash
systemctl start minecraft_server
```

次でステータスがみれます。

```bash
systemctl status minecraft_server
```

こんな感じ:

```bash
# systemctl status minecraft_server
minecraft_server.service - Minecraft Server
   Loaded: loaded (/etc/systemd/system/minecraft_server.service; enabled)
   Active: active (running) since 日 2015-09-13 15:24:38 JST; 1min 57s ago
 Main PID: 1813 (bash)
   CGroup: /system.slice/minecraft_server.service
           ├─1813 /bin/bash /home/minecraft/minecraft/boot
           └─1814 java -Xms1024M -Xmx1024M -jar /home/minecraft/minecraft/minecraft_server.jar nogui

 9月 13 15:24:43 mctest.cs429idcfcloud.internal bash[1813]: [15:24:43] [Server thread/INFO]: Starting minecraft server version 1.8.8
 9月 13 15:24:43 mctest.cs429idcfcloud.internal bash[1813]: [15:24:43] [Server thread/INFO]: Loading properties
 9月 13 15:24:43 mctest.cs429idcfcloud.internal bash[1813]: [15:24:43] [Server thread/INFO]: Default game type: SURVIVAL
 9月 13 15:24:43 mctest.cs429idcfcloud.internal bash[1813]: [15:24:43] [Server thread/INFO]: Generating keypair
 9月 13 15:24:43 mctest.cs429idcfcloud.internal bash[1813]: [15:24:43] [Server thread/INFO]: Starting Minecraft server on *:25565
 9月 13 15:24:43 mctest.cs429idcfcloud.internal bash[1813]: [15:24:43] [Server thread/INFO]: Using epoll channel type
 9月 13 15:24:43 mctest.cs429idcfcloud.internal bash[1813]: [15:24:43] [Server thread/INFO]: Preparing level "world"
 9月 13 15:24:44 mctest.cs429idcfcloud.internal bash[1813]: [15:24:44] [Server thread/INFO]: Preparing start region for level 0
 9月 13 15:24:45 mctest.cs429idcfcloud.internal bash[1813]: [15:24:45] [Server thread/INFO]: Preparing spawn area: 54%
```

終了するときは次のコマンドです。

```bash
systemctl stop minecraft_server
```

# おわりに
以上です！快適なMinecraftライフを！:bomb: