【Minecraft】サーバーを自動起動する

Minecraft

Minecraftサーバーを運用していて、再起動するたびに起動コマンドを実行するのがめんどくさいと思ったことはありませんか?

「systemd」を使用すればそれが解決できます!。
ということで、さっそくやってみましょう!。

スポンサーリンク

screenをインストールする

「screen」を入れていない場合は、まずインストールしましょう。

「screen」は、仮想端末(別ウィンドウ)を簡単に作成することができるため、サーバー実行中でも別の作業を行うことができるため、入れておくと便利です!。

Ubuntuの場合

apt-get install screen

CentOSの場合

yum install screen

細かい設定もできますので、時間があったらやってみるといいかもしれません。

詳しい使い方は今回説明しません。

起動用スクリプトを作成

サーバーを起動するスクリプトを作成します。

スクリプトはサーバーファイルと同じところに配置します。
今回は「/opt/minecraft/server/」に配置します。
ファイル名は「start.sh」とします。

#!/bin/sh

#screenの名前
SCREEN_NAME='minecraft'

screen -UAmdS $SCREEN_NAME java -server -Dfile.encoding=UTF-8 -Xms8G -Xmx8G -jar /opt/minecraft/server/server.jar

必ず実行権限を与えておきましょう。

chmod +x start.sh

停止用スクリプトを作成

サーバーを停止するスクリプトを作成します。

起動用スクリプトと同じところに配置します。
ファイル名は「stop.sh」とします。

#!/bin/sh

# screenの名前
SCREEN_NAME='minecraft'

if [ -n "$(screen -list | grep -o "${SCREEN_NAME}")" ]; then
    # 停止開始
    echo [date '+%F %T'] 'server stop script start'
    # サーバー内にアナウンス
    screen -S $SCREEN_NAME -X stuff 'say 30秒後にサーバーを停止します\015'
    sleep 30s
    # セーブコマンド発行
    screen -S $SCREEN_NAME -X stuff 'save-all\015'
    sleep 5s
    # 停止コマンド発行
    screen -S $SCREEN_NAME -X stuff 'stop\015'
    #停止実行待機
    sleep 30s
else
    echo [date '+%F %T']  'server is not runnning'
fi

急にサーバー停止すると、参加者の方もびっくりしてしまいます。

そのため、サーバー内へアナウンスしたのちに停止させます。

また、起動用スクリプト同様、実行権限を与えるのを忘れずに!

Unitファイルを作成

自動起動させるためのファイルを作成します。

作成先は「/usr/lib/systemd/system/」です。
ファイル名は「minecraft.service」とします。

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

[Service]
Type=forking
User=root  # minecraft専用ユーザーがいる場合、書き換える
Group=root # Userと同様
WorkingDirectory=/opt/minecraft/server/  # 上記スクリプトを配置した場所
ExecStart=/opt/minecraft/server/start.sh # 起動用スクリプトの場所
ExecStop=/opt/minecraft/server/stop.sh   # 停止用スクリプトの場所
Restart=always

[Install]
WantedBy=multi-user.target

上記ファイルを作成したら、次のコマンドを実行します。

[root@xxx.xxx.xxx.xxx]# systemctl daemon-reload      # サービスを再読み込みする
[root@xxx.xxx.xxx.xxx]# systemctl enable minecraft   # 自動起動を有効化
# 下のメッセージが出たら、自動起動が有効化されたということ
Created symlink /etc/systemd/system/multi-user.target.wants/minecraft.service → /usr/lib/systemd/system/minecraft.service.

[root@xxx.xxx.xxx.xxx]# systemctl status minecraft   # 状態確認
● minecraft.service - Minecraft Server Service
    Loaded: loaded (/usr/lib/systemd/system/minecraft.service; enabled; vendor preset: enabled)
    Active: inactive (dead)

「Loaded: loaded」になっていれば準備OK!。

一度サーバーを再起動して、問題なければ完了です!。

ちなみに、下記コマンドで起動用スクリプトを実行できます。

systemctl start minecraft

正常に起動すれば、状態確認コマンド実行したときに
「Active: inactive (dead)」から「Active: active (running)」になっているはずです。

停止用スクリプトを実行する場合は下記コマンドを実行します。

systemctl stop minecraft

まとめ

特別、難しいスクリプトを組むことなく、「systemd」を使って簡単に自動起動できるようになりました。

Minecraft以外にも「systemd」を使える場面はあると思いますので、覚えておくと良いかもしれませんね。

コメント

  1. systemctl staus minecraft コマンドを使うとLoadedはloadedになるのに、Activeがfailed と失敗してしまいます。どうすれば解決できますか?

    • あとvendor presetも disbledになってます

      • エラーの内容がないため申し訳ないですが判断が難しいです。
        「systemctl staus」コマンド使用時に下のほうにエラーが出ていませんか?。

        ファイルのパーミッション等も見直してみてください!。

  2. systemctl start minecraftを実行し、無事Active(running)になるのですが、minecraftサーバー本体が起動せず16秒弱で止まって起動を繰り返して、起動ができません。

    • まず、下記コマンドでエラーログを確認してみてください!
      Unit名は、この記事の通りであればminecraftになります。

      journalctl -u [Unit名]

      また、javaコマンドで通常通りサーバーが起動できているかも確認してみてください!。

      • サーバーの起動はできたのですがログが出ません。
        ログ=プラグインの読み込みの状況やワールド生成の状態など

      • javaコマンドで通常通り起動できたといういことでよかったでしょうか…?
        ログの内容等を私から確認できないので憶測になりますが、サーバー起動が正常であるとなるとサービスファイルなどで問題が起こっていることになります。
        まずは先日ご紹介したjournalctlコマンドで、サービスログを確認してみてください!。

  3. 動作環境はCentOS8で行いました。

    systemctl 以降でエラーを吐かれ自動起動がうまくいきません。

    「strat.sh」「stop.sh」はcmdからの実行で問題なく動きます。
    「sh /home/minecraft/start.sh」

    実行権限も2つとも与えました。

    原因は Unit ファイルにあると思っています。

    “`
    [Unit]
    Description=Minecraft Server Service
    After=network.target

    [Service]
    Type=forking
    User=minecraft # minecraft専用ユーザーがいる場合、書き換える
    Group=minecraft # Userと同様
    WorkingDirectory=/home/minecraft/ # 上記スクリプトを配置した場所
    ExecStart=/home/minecraft/start.sh # 起動用スクリプトの場所
    ExecStop=/home/minecraft/stop.sh # 停止用スクリプトの場所
    Restart=always

    [Install]
    WantedBy=multi-user.target
    “`
    ユーザーはroot以外にminecraftも作成していたため、minecraftにしましたが、このUserとGroupでエラーを吐かれてしまします。
    rootにしてみたがエラー。

    「systemctl status minecrat」
    /usr/lib/systemd/system/minecraft.service:7: Invalid user/group name or numeric ID: minecraft # minecraft専用ユーザーがいる場合、書き換える

    こういったエラーになってしまいます。

    それと、「journalctl -u minecraft」もやってみましたが、こちらはstart関連がエラーを吐いてるみたいで…

    localhost.localdomain systemd[1]: Starting Minecraft Server Service…
    localhost.localdomain systemd[1]: minecraft.service: Control process exited, code=exited status=203
    localhost.localdomain systemd[1]: minecraft.service: Failed with result ‘exit-code’.
    localhost.localdomain systemd[1]: Failed to start Minecraft Server Service.
    localhost.localdomain systemd[1]: minecraft.service: Service RestartSec=100ms expired, scheduling restart.
    localhost.localdomain systemd[1]: minecraft.service: Scheduled restart job, restart counter is at 2.
    ocalhost.localdomain systemd[1]: Stopped Minecraft Server Service.

    「systemctl start minecraft」をやるとエラーを吐かれるのでこれだと思うんですが
    「systemctl stop minecraft」のほうはエラーも吐かれないので大丈夫だと思うんですが、minecraftのサーバーを開いている状態でやってもサーバーが停止しないんですよね…

    すごく長くなってしまいましたが、解決のためご協力いただければ幸いです。
    よろしくお願いします。

    • エラー情報ありがとうございます。
      予想ですが、スクリプト等の権限が不足しているように見えます。
      権限付与が正しく行われているかを確認をしてみましょう!。
      下記コマンドをスクリプト等があるディレクトリで実行して、スタート用スクリプト等の権限を確認してみてください。

      ls -l

      例えば、サービスファイルの「User」に「minecraft」ユーザーを設定した場合、スタート用スクリプトや配置しているディレクトリの所有者が「minecraft」ユーザーである必要があります。
      不明であれば、コマンドの実行結果をコメントにて共有いただければと思います。

タイトルとURLをコピーしました