web-dev-qa-db-ja.com

Ubuntu 18.04でminecraft bedrockサーバーのサービススクリプトを作成する方法

プライベートMinecraft Bedrockサーバーとして使用するために、Ubuntu 18.04インスタンスをセットアップしました。

サーバー自体を https://www.minecraft.net/en-us/download/server/bedrock/ からダウンロードしました

シェルから直接実行でき、すべて正常に動作します。ただし、私がやりたいのは、サービスとして構成することです。そのため、起動時に自動的に開始し、正常に停止します。

「bedrock_server」実行可能ファイルはフォアグラウンドで実行され、「stop」、「kick」、「save」など、標準入力からのさまざまなコマンドを待ちます。

そのように制御できるようにサービススクリプトを設定する方法はありますか...

$ service minecraft stop
$ service minecraft restart

私のような他のMinecraft固有のコマンドも発行できればさらに良いでしょう...

$ service minecraft kick [player name or xuid]

等.

私はこの機能についてあまり心配していません。私が欲しい主なことは、サーバーの起動時に適切に起動し、適切に停止できることです。

完全に書いておく必要はありません。誰かが私をチュートリアル、またはテンプレートなどに導くことができれば、それは素晴らしいことです。

これは、シェルから起動するために現在使用している完全なコマンドです...

$ cd /home/[my-user]/bedrock-server-1.14.60.5 && LD_LIBRARY_PATH=. ./bedrock_server

更新...

以下の答えと多くの試行錯誤に基づいて、このsystemdスクリプトを思いつきました...

[Unit]
Description=Minecraft Bedrock Service
After=network-online.target

[Service]
User=[my-user]
WorkingDirectory=/home/[my-user]/bedrock-server-1.14.60.5
Type=forking
ExecStart=/usr/bin/screen -dmS UbuntuMinecraft /bin/bash -c "LD_LIBRARY_PATH=. ./bedrock_server"
ExecStop=/usr/bin/screen -Rd UbuntuMinecraft -X stuff "say Stopping server in 10 seconds...\r"
ExecStop=/bin/sleep 10
ExecStop=/usr/bin/screen -Rd UbuntuMinecraft -X stuff "stop\r"
GuessMainPID=no
TimeoutStartSec=600

[Install]
WantedBy=multi-user.target

これはかなりうまくいくようです。

サーバーで他のコマンドを実行する必要がある場合は、次のようにscreenセッションに接続できます...

$ screen -R UbuntuMinecraft

次に、必要なネイティブコマンドを実行できます。

私のソリューションは部分的にこのコードに基づいています... https://github.com/TheRemote/MinecraftBedrockServer

1
user1751825

初期化スクリプトは、使用しているディストリビューションのバージョンによって異なりますが、Ubuntuの最新バージョンのほとんどはsystemdを使用していると思います。だからあなたがおそらく欲しいもの Systemdファイル

Systemdファイルは、主に正しい値に置き換える必要がある標準形式に従います。

私はこれをテストしていませんが、標準の構文に従って、これらの行に沿って何かが欲しいでしょう:

[Unit]
Description=Minecraft Service
After=network.target

[Service]
Type=Simple
WorkingDirectory=/home/user/bedrock-server-1.14.60.5
ExecStart=/bin/sh -c "LD_LIBRARY_PATH=. ./bedrock_server"
Restart=on-failure

[Install]
WantedBy=multi-user.target

TimeoutStopSecのように ここで設定できるさまざまなもの があります。これにより、「stop」コマンドを実行してプロセスを強制終了する前にサービスをシャットダウンする時間を設定できます。

ディストリビューションの適切なフォルダー(/ etc/systemd/system)にファイルをドロップすると、systemctlまたはserviceコマンドを使用してサービスを制御できます。

「minecraft」という名前のサービスを作成した場合、次のようなコマンドを使用できます。

systemctl status minecraft-現在のステータスを取得
systemctl starts minecraft-サービスを開始します
systemctl stop minecraft-サービスを停止します
systemctl enable minecraft-起動時にこのサービスを開始します

コンソールコマンドを実行できるかどうかは、サービスの処理方法によって異なります。私がJava Minecraftサーバーを実行していたときに、コンソールにコマンドを送信するために「RCON」を使用することができましたが、ソケットへのバインドなどの他のトリックがありました。

私はこのコードの安全性を保証できませんが、簡単なGoogleは、誰かがこの種の機能のために正しいソケットラッパーをここに作成したことを暗示しています: https://github.com/TapeWerm/MCscripts

別のオプションは、スクリーンセッションでMinecraftを起動することです。これにより、実行中のコンソールに自由に再接続できます。

1
KHobbits