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」を使える場面はあると思いますので、覚えておくと良いかもしれませんね。
コメント
systemctl staus minecraft コマンドを使うとLoadedはloadedになるのに、Activeがfailed と失敗してしまいます。どうすれば解決できますか?
あとvendor presetも disbledになってます
エラーの内容がないため申し訳ないですが判断が難しいです。
「systemctl staus」コマンド使用時に下のほうにエラーが出ていませんか?。
ファイルのパーミッション等も見直してみてください!。