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

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

今回は、ほとんどのLinuxで標準機能であるsystemdを使用して、自動再起動を行う方法を紹介したいと思います。

screenをインストールする

screenは、仮想端末(別ウィンドウ)を簡単に作成することができ、同じSSH端末上で別の作業を同時に行うことができる便利なソフトウェアです!。

今回はこのscreenを使用して作業していくので、入れていない場合はインストールしましょう。

Ubuntuの場合

コマンド
apt-get install screen

CentOSの場合

コマンド
yum install screen

起動用スクリプトを作成

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

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

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としました。

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としました。

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を使える場面はあると思いますので、覚えておくと良いかもしれませんね。

9 COMMENTS

TKMV

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

返信する
管理人

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

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

ひか

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

返信する
管理人

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

journalctl -u [Unit名]

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

返信する
ひか

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

管理人

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

ゴーディー

動作環境は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」ユーザーである必要があります。
不明であれば、コマンドの実行結果をコメントにて共有いただければと思います。

返信する

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください