Minecraftサーバーを運用していて、再起動するたびに手動で起動コマンドを実行するのがめんどくさいと思ったことはありませんか?
今回は、ほとんどのLinuxで標準機能であるsystemdを使用して、自動再起動を行う方法を紹介したいと思います。
【非推奨】screenをインストールする
screenは、仮想端末(別ウィンドウ)を簡単に作成することができ、同じSSH端末上で別の作業を同時に行うことができる便利なソフトウェアです!。
今回はこのscreenを使用して作業していくので、入れていない場合はインストールしましょう。
Ubuntuの場合
apt-get install screen
CentOSの場合
yum install screen
起動用スクリプトを作成
サーバーを起動するスクリプトを作成します。
スクリプトはMinecraftのサーバーファイルと同じところに配置します。
今回は、/opt/minecraft/server/に配置し、ファイル名はstart.shとしました。
#!/bin/bash
#screenの名前
SCREEN_NAME='minecraft'
tmux new -s $SCREEN_NAME -d 'java -server -Dfile.encoding=UTF-8 -Xms8G -Xmx8G -jar /opt/minecraft/server/server.jar'
必ずスクリプトの実行権限を与えておきましょう。
chmod +x start.sh
Minecraftサーバーのコンソールを表示するには?
上記の起動用スクリプトで起動した、Minecraftサーバーのコンソールを表示する場合は、下記コマンドを実行します。
tmux a -t minecraft
コンソールから抜ける場合は、下記のキーを押すことで抜けることができます。
Ctrl + b を押下後に d
停止用スクリプトを作成
サーバーを停止するスクリプトを作成します。
起動用スクリプトと同じところに配置します。ファイル名はstop.shとしました。
#!/bin/bash
# screenの名前
SCREEN_NAME='minecraft'
if [ -n "$(tmux list-sessions | grep -o "${SCREEN_NAME}")" ]; then
# 停止開始
echo [`date '+%F %T'`] 'server stop script start'
# サーバー内にアナウンス
tmux send-keys -t $SCREEN_NAME "say 30秒後にサーバーを停止します" ENTER
sleep 30s
# セーブコマンド発行
tmux send-keys -t $SCREEN_NAME "save-all" ENTER
sleep 5s
# 停止コマンド発行
tmux send-keys -t $SCREEN_NAME "stop" ENTER
#停止実行待機
sleep 30s
else
echo [`date '+%F %T'`] 'server is not runnning'
fi
急にサーバー停止すると参加者がびっくりするので、サーバー内へ事前にアナウンスした後に停止させるようにしています。
また、起動用スクリプト同様に実行権限を与えるのを忘れずに行いましょう!
Unitファイルを作成
自動起動の制御をするためのファイルを作成します。
作成先は/etc/systemd/system/で、ファイル名はminecraft.serviceとしました。
[Unit]
Description=Minecraft Server Service
After=network.target
[Service]
Type=forking
# minecraft専用ユーザーがいる場合、書き換える
User=root
# Userと同様、専用グループがある場合は、書き換える
Group=root
# 上記スクリプトを配置した場所
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 → /etc/systemd/system/minecraft.service.
[root@xxx.xxx.xxx.xxx]# systemctl status minecraft # 状態確認
● minecraft.service - Minecraft Server Service
Loaded: loaded (/etc/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を使える場面はあると思いますので、覚えておくと良いかもしれませんね。
systemctl staus minecraft コマンドを使うとLoadedはloadedになるのに、Activeがfailed と失敗してしまいます。どうすれば解決できますか?
あとvendor presetも disbledになってます
エラーの内容がないため申し訳ないですが判断が難しいです。
「systemctl staus」コマンド使用時に下のほうにエラーが出ていませんか?。
ファイルのパーミッション等も見直してみてください!。
systemctl start minecraftを実行し、無事Active(running)になるのですが、minecraftサーバー本体が起動せず16秒弱で止まって起動を繰り返して、起動ができません。
まず、下記コマンドでエラーログを確認してみてください!
Unit名は、この記事の通りであればminecraftになります。
また、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のサーバーを開いている状態でやってもサーバーが停止しないんですよね…
すごく長くなってしまいましたが、解決のためご協力いただければ幸いです。
よろしくお願いします。
エラー情報ありがとうございます。
予想ですが、スクリプト等の権限が不足しているように見えます。
権限付与が正しく行われているかを確認をしてみましょう!。
下記コマンドをスクリプト等があるディレクトリで実行して、スタート用スクリプト等の権限を確認してみてください。
例えば、サービスファイルの「User」に「minecraft」ユーザーを設定した場合、スタート用スクリプトや配置しているディレクトリの所有者が「minecraft」ユーザーである必要があります。
不明であれば、コマンドの実行結果をコメントにて共有いただければと思います。
当サイトと全く同じ手順と内容で進めていったのですが、再起動後に状態確認を行うと以下のようなエラーが出ます
minecraft.service – Minecraft Server Service
Loaded: loaded (/lib/systemd/system/minecraft.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2022-08-24 04:46:25 JST; 20s ago
Process: 2622 ExecStart=/home/seeker/minecraft/1.19.2/start.sh # 起動用スクリプトの場所 (code=exited, status=217/USER)
CPU: 1ms
8月 24 04:46:25 seeker-VirtualBox systemd[1]: minecraft.service: Scheduled restart job, restart counter is at 5.
8月 24 04:46:25 seeker-VirtualBox systemd[1]: Stopped Minecraft Server Service.
8月 24 04:46:25 seeker-VirtualBox systemd[1]: minecraft.service: Start request repeated too quickly.
8月 24 04:46:25 seeker-VirtualBox systemd[1]: minecraft.service: Failed with result ‘exit-code’.
8月 24 04:46:25 seeker-VirtualBox systemd[1]: Failed to start Minecraft Server Service.
minecraft.serviceの中のスクリプトの場所など、環境ごとに変更すべきである場所は変更を加えています
どのように対応すればよいでしょうか?よろしくお願いします
記載された内容を確認する限りですと、「minecraft.service」で指定しているユーザーが存在していないのではないでしょうか?。
「User=XXX」で指定しているユーザーが存在しているかをまずは確認してみてください!。
もしかしてですが、サービスファイルを下記のように修正することでエラー解消できないでしょうか?。(記事は修正済)
↓