Minecraft Bedrock Dedicated Serverをscreenで立ち上げる

# バージョン
Ubuntu Server 18.04 LTS
Minecraft Bedrock Dedicated Server 1.7.0.13 alpha

現在のBedrock Dedicated Server（BDS）はアルファ版なので、仕様が変わる可能性は大いにあります。

# 結論（コマンド）

最初に結論から。
マニュアル記載の起動コマンド↓に対して

```bash
$ LD_LIBRARY_PATH=. ./bedrock_server
```

screenでBDSを起動するにはこう↓

```bash
$ LD_LIBRARY_PATH=. screen -S bds ./bedrock_server
```

上のコマンドだと作成したセッションにアタッチした状態で起動してしまうので、デタッチした状態で起動したい場合はこう↓

```bash
$ LD_LIBRARY_PATH=. screen -dmS bds ./bedrock_server
```

セッションをアタッチする（シェルからBDSのコンソールに移動する）には`screen -r bds`
セッションをデタッチする（BDSのコンソールからシェルに移動する）には`Ctrl+a d`

以下、screenコマンドの使い方など

# マニュアル通りだと不便
SSHでUbuntuにログインしているような状態でマニュアル通り起動すると…

```console
$ LD_LIBRARY_PATH=. ./bedrock_server
NO LOG FILE! - setting up server logging...
NO LOG FILE! - [2018-11-22 00:46:27 INFO] Starting Server
NO LOG FILE! - [2018-11-22 00:46:27 INFO] Version 1.7.0.13
NO LOG FILE! - [2018-11-22 00:46:27 INFO] Level Name: Bedrock level
NO LOG FILE! - [2018-11-22 00:46:27 INFO] Game mode: 0 Survival
NO LOG FILE! - [2018-11-22 00:46:27 INFO] Difficulty: 1 EASY
NO LOG FILE! - [2018-11-22 00:46:30 INFO] IPv4 supported, port: 19132
NO LOG FILE! - [2018-11-22 00:46:30 INFO] IPv6 supported, port: 19133
NO LOG FILE! - [2018-11-22 00:46:30 INFO] Server started.
```

この状態でSSHを切断するとBDSが落ちてしまいます。
また、BDSを実行したままシェルに戻れないので、メモリの使用率を見たり、バックアップを取ることができません。

ということで改良です。いったんBDSは終了させておきましょう。

```
stop
```

# screenで起動
`screen`コマンドを使って新しいセッションでBDSを起動すると便利です。
Ubuntu（シェル）とBDSのコンソールを行ったり来たりできる上に、SSHを切断しても終了しません。

新しいセッションでBDSを起動する

```bash
$ LD_LIBRARY_PATH=. screen -S bds ./bedrock_server
```

「-S <セッション名>」でセッションに名前を付けることができます（上の例では「bds」というセッション名を指定）。
アタッチする際などに名前でセッションを指定できるので便利。

起動を確認したら`Ctrl+a d`でセッションをデタッチすれば元のシェルに戻ってきます。
（デタッチしてもBDSは起動したままです）

```
[detached from 7039.bds]
$
```

# 便利なscreenコマンド

存在するセッションを確認したいときは`screen -ls`

```bash
$ screen -ls
There is a screen on:
        7039.bds (11/22/2018 01:01:01 AM)        (Detached)
1 Socket in /run/screen/S-bds-user.
```

---

BDSのコンソールに戻りたい（セッションをアタッチしたい）ときは`screen -r <セッション名>`

```bash
$ screen -r bds
```

```
...
NO LOG FILE! - [2018-11-22 01:02:28 INFO] IPv4 supported, port: 19132
NO LOG FILE! - [2018-11-22 01:02:28 INFO] IPv6 supported, port: 19133
NO LOG FILE! - [2018-11-22 01:02:29 INFO] Server started.

```

`Ctrl+a d`でセッションをデタッチします。

---

デタッチした状態でBDSにコマンド（stopなど）を送りたい場合は`screen -r <セッション名> -X stuff $"<コマンド>\n"`

```bash
$ screen -r bds -X stuff $"stop\n"
```

ちなみにstopコマンドでBDSを終了させると、そのセッションも終了します。

---

デタッチした状態でBDSのコンソールに出力されている内容（ログ）をファイルに保存するときは`screen -r <セッション名> -X hardcopy -h <ファイル名>`

```bash
$ screen -r bds -X hardcopy -h /home/bds-user/bds.log
```

-hを付けることでスクロールバックバッファも出力します。

# おまけ：起動スクリプト・再起動スクリプト

起動スクリプト

```bash:bds_start.sh
#!/bin/bash

# bedrock_serverのディレクトリ
SERVER_DIR=/home/bds-user/minecraft
# セッション名
SESSION_NAME='bds'

cd ${SERVER_DIR}
LD_LIBRARY_PATH=. screen -dmS ${SESSION_NAME} ./bedrock_server
```


再起動スクリプト

```bash:bds_restart.sh
#!/bin/bash

# 起動スクリプト
START_SCRIPT=/home/bds-user/bds_start.sh
# セッション名
SESSION_NAME='bds'

# BDSにstopコマンド送信
screen -r ${SESSION_NAME} -X stuff $"stop\n"

# セッションが終了するのを待ちます
while true
do
  screen -r ${SESSION_NAME} -X select . > /dev/null || break
  sleep 1
done

# バックアップするならここで
# cp -a / rsync -a

${START_SCRIPT}
```

余裕があればバックアップしましょう。
BDSには終了せずにバックアップを取るための`save hold` `save query` `save resume`もあります。

実行前にパーミッションの設定もお忘れなく

```bash
$ chmod +x bds_start.sh
$ chmod +x bds_restart.sh
```

参考：[Minecraftサーバをscreenとcronでプラグインを使わずに自動再起動する](https://jyn.jp/minecraft-server-auto-restart/)

# 蛇足
`LD_LIBRARY_PATH=. ./bedrock_server`が何をしているのか分かりませんでしたが、

```console
$ HOGE=hello ./command.sh
```
のように実行することで変数（この場合`HOGE`）を渡せるんですね。知りませんでした。

```bash:command.sh
#!/bin/bash

echo ${HOGE} # hello
```