こんにちは、ふじみや です。
以前、マイクラのマルチプレイ用サーバーをsystemdを利用して自動起動する方法についてご説明をしました。
非常に便利なのですが、例えばGeyserMCのプラグインの更新が必要だったとサーバー立ち上げ後に気が付いて、起動したサーバーを停止したいということもあるかと思います。
とはいえ、ターミナルソフトを立ち上げると接続はできるもののサーバーの停止操作をどこですればいいかわからない、と悩む方もいらっしゃるのではないでしょうか(私はそうでした。)。
「プラグインの最新版を入れて、EC2インスタンスを再起動すればいいじゃん」というご意見もあろうかと思いますが、それだとサーバーを安全に停止してないのでイヤといった方向けの記事です。
- AWSを使ってマイクラサーバーの立ち上げる
- マインクラフトの軽量サーバー導入【PaperMC】
- ニンテンドースイッチ版マイクラでマルチサーバーに接続する方法
- Linux起動時にマイクラサーバーを自動立ち上げ【systemd】
- マイクラサーバーをバックグラウンドで自動起動【systemd & screen】 ★おすすめ
- EC2インスタンスの簡単起動【AWS CLI】
- EC2インスタンスの簡単停止
- LINEからEC2インスタンスを開始・停止させてみよう【API Gateway + Lambda】 ★おすすめ
- マイクラサーバーのワールドデータを定期バックアップ【Amazon S3】 ★おすすめ
- マイクラサーバーの自動停止【Python】 ★おすすめ
- 【Minecraft】ホワイトリスト機能を活用しよう【荒らし防止】
自動起動の方法を変更
以前ご紹介をしたsystemdを利用した自動起動の場合だと、調べてもよく分からなかったので次のように発想を変えてみました。
- systemdで起動したマイクラサーバーに停止コマンドをどうやって打つか分からない
- そもそもサーバーのログは確認できるが、サーバーのコンソール画面ってどうやって表示するの?
- 分からないなら、起動時にマイクラのサーバーがどこで実行されているか分かるようにしよう!
上記のニーズを満たす機能として、Linuxには「screen」という機能があり、これを使ってサーバーを起動すればコンソールの表示ができるようになるということが分かりましたので、今回はこの機能を使用します。
screenとは
ざっくりと説明をすると、「screen」とはLinux上で新しいウィンドウ(セッション)を作って、そこでプログラムを実行させるために使うコマンドです。
通常、プログラムを実行している間は他のプログラムを実行させたりすることはできませんが、screenを利用することで、複数のプログラムを同時に実行することができるようになります。
screenのインストール
Amazon Linux 2にはscreen機能がインストールされているはずですが、確認してみましょう。
sudo yum -y install screen
次のように「Nothing to do」と表示されていればOKです。
screenの基本的な使い方
screenの使い方は非常に簡単で、実行したいコマンドの前にscreenとつけるだけで大丈夫です。
たとえば、minecraftディレクトリ内にあるstart.shをscreenを使って起動する場合には次にようなコマンドを入力すればOKです。
screen sh /home/ec2-user/minecraft/start.sh
ターミナルソフトから上記のコマンドを入力した場合、新しいウィンドウが立ち上がってサーバーの起動が始まるのが分かるかと思います。
立ち上げたウィンドウにて、「ctrl+a」(ctrlキーとaキーの同時押し)を押下後、「d」を押下することで、元の画面に戻ることができます。この元の画面に戻ることを「デタッチ」といいます。
そのほかのよく使う操作については以下の通りです。
#screenのセッションを一覧表示
screen -ls
#screenのセッションを指定してアタッチ(screenのウィンドウに切り替えること)
screen -r [screen -lsで表示されるセッションの番号]
systemdの修正
それでは、systemdでサーバーを自動起動する際に、screenを使うようにしていきましょう。
Unitファイルの変更
まず、Unitファイル内のExecStartを次のように変更してみたのですが、上手くいきません。なお、ここでユーザーを指定しないとルートユーザーとしてscreenを実行するということになりますので、忘れずにec2-userとして実行するように指定しておきましょう。
User=ec2-user
ExecStart=/bin/screen -D -m -S minecraft /bin/bash /home/ec2-user/minecraft/start.sh
このうち、screenのあとのオプションについては「minecraftという名前のscreenをデタッチ状態で起動」という意味になります。
オプション | 意味 |
-D -m | セッションをデタッチ状態で起動 |
-S セッション名 | セッションに名前を付ける |
そこで、start.shではなく、サーバーファイルをそのまま実行するように変えてみましょう。
User=ec2-user
ExecStart=/bin/screen -d -m -S minecraft /bin/java -Xms2G -Xmx2G -jar /home/ec2-user/minecraft/spigot-1.19.2.jar nogui
サーバーファイル名の変更
ここで、サーバーファイル名を「spigot-1.19.2.jar」など、入手した際の名前のままにしていた場合、サーバーファイルがアップデートされたらUnitファイルを毎回変更しなければならず、面倒です。
そこで、サーバーファイル名を変更してUnitファイル内の記載は変更しなくて良いようにしておきましょう。
Unitファイル内の記載
User=ec2-user
ExecStart=/bin/screen -D -m -S minecraft /bin/java -Xms2G -Xmx2G -jar /home/ec2-user/minecraft/spigot.jar nogui
上に記載したものからは、サーバーファイル名を変更しただけです。
サーバーファイル名の変更
mv spigot-1.19.2.jar spigot.jar
「mv」は通常、ファイルを移動させるために使用するコマンドですが「mv 元のファイル名 新しいファイル名」とすることで、ファイルの名前を変更することが可能です。
この場合では「spigot-1.19.2.jar」を「spigot.jar」という名前に変更する、という意味になります。
ログファイルの保存
screen機能を使用すると、Minecraftディレクトリ内のログファイルが更新されなくなります。そのため、必要であればscreenにて出力された内容をログファイルとして保存する設定を行いましょう。
まず、ホームディレクトリにscreenの環境設定用ファイルを作成しましょう。
vim .screenrc
エディタが開いたら次を入力すればOKです。これは/minecraft/logs内に、例えば「2022-10-11.log」という名前のログを作成するという意味になります。
#ログの自動保存
logfile "/home/ec2-user/minecraft/logs/%Y-%m-%d.log"
deflog on
起動確認
ここまで出来たらsystemdを再読み込みし、起動をしてみましょう。
sudo systemctl daemon-reload
sudo systemctl restart minecraft.service
これらのコマンドを入力しても何も表示されませんので、次のコマンドを入力して状態を確認してみましょう。
以下のような状態になっていれば成功です!
systemctl status minecraft.service
screen -ls
まとめ
今回は、マイクラのサーバー起動にsystemdとscreenを組み合わせる方法についてご紹介をしました。
私はまだまだLinux初心者ですので、screenを多用するような機会はありませんが、長時間を要するスクリプトを実行する際にscreenコマンドを利用することで別セッションに飛ばし、メインのウィンドウでは別の作業を行うこともできそうで、効率的な作業を行うことができるのではないでしょうか。
こんなふうに使うともっと便利になるよ!といったご提案などございましたら、ぜひコメントを残していっていただければと思いますので、どうぞよろしくお願いします。
それではまた。
コメント