Minecraftサーバーにシェルスクリプトからコマンド入力する方法
マイクラのサーバーを管理することになったので, シェルスクリプトからコマンドを実行できるようにしました.
screen
で実行する
こちらの記事を参考にしつつ, マイクラを screen
で実行します.
# !/bin/bash
screen -UAmdS minecraft java -server -jar server.jar nogui
Javaのオプションはそれぞれ良い感じに設定して下さい.
このようにすることで, マイクラサーバーを screen
上で起動できます.
minecraft
の部分はスクリーン名です. 自分の分かりやすい名前に設定しましょう.
シェルスクリプトからマイクラのコマンドを飛ばす
次にシェルスクリプトからマイクラのサーバーに向けてメッセージを飛ばしてみたいと思います.
# !/bin/bash
screen -p 0 -S <スクリーン名> -X eval 'stuff "say Hello World!\015"
<スクリーン名>
は上で設定したものに置き換えて下さい.
このようにすると, マイクラのサーバーでプレイしているユーザーに向けてメッセージを送ることができます.
同じように, 以下のスクリプトを実行することで, マイクラのサーバーをシェルスクリプトからシャットダウンすることができます.
# !/bin/bash
screen -p 0 -S <スクリーン名> -X eval 'stuff "stop\015"'
stuff
の後ろの部分がマイクラのサーバーの標準入力に流し込まれるという形で動作します.
なお, \015
は改行コードです.
Raw JSON
が必要なコマンドの実行
ここまでは、先ほどの記事に書いてあった通りなのですが, マイクラの title
コマンドを使おうとすると, ダブルクオート("
)がうまく入力できず, 苦労しました.
Qiitaでも調べてみると, 同じ悩みを抱えている方を発見しました.
根気よくググり続けていると, これを解決している海外の記事を発見することができました.
以下のようにすることで, ダブルクオートが必須である Raw JSON
を引数とするようなコマンドを実行できます.
# !/bin/bash
screen -p 0 -S mc -X eval 'stuff "title @a title {"'
screen -p 0 -S mc -X stuff \"text\":\"タイトル表示\", \"bold\":true}
screen -p 0 -S mc -X eval 'stuff "\015"'
これは, マイクラサーバー上で以下のコマンドを実行したのと同じ処理になります.
title @a title {"text":"タイトル表示", "bold":true}
1つ目の screen
コマンドの部分を Raw JSON
が必要なコマンドに, 2つ目の screen
コマンドの部分に Raw JSON
の内容を記入することで, titleコマンドを含む様々なコマンドをシェルスクリプトから実行できるようになります.
また, 他のコマンドは今まで通りのやり方で実行できますので, playsound
コマンドを併用して, title
コマンドと同時に鐘の音を鳴らすということも可能です.
それ以外の部分は普通のシェルスクリプトとして動作するため, Unixの sleep
コマンドや, cURL
を使ったDiscord WEBHOOKによる通知を併用することも可能です.
以下は再起動用シェルスクリプトの一例です.
# !/bin/bash
curl -X POST -H "Content-Type: application/json" -d '{"username": "MC Server" , "content": "1時間後に定期再起動を実施します。"}' "https://discord.com/api/webhooks/<WEBHOOKのURL>"
screen -p 0 -S mc -X eval 'stuff "title @a title {"'
screen -p 0 -S mc -X stuff \"text\":\"§6§n§l1時間後§rに§b§n§l定期再起動§rを実施します\"}
screen -p 0 -S mc -X eval 'stuff "\015"'
screen -p 0 -s mc -X eval 'stuff "playsound block.bell.use master @a\015"'
sleep 3600
curl -X POST -H "Content-Type: application/json" -d '{"username": "MC Server" , "content": "サーバーの再起動を開始します。\n再起動は約5分で終了します。"}' "https://discord.com/api/webhooks/<WEBHOOKのURL>"
screen -p 0 -S mc -X eval 'stuff "title @a title {"'
screen -p 0 -S mc -X stuff \"text\":\"§b§l§n再起動§rを開始します\"}
screen -p 0 -S mc -X eval 'stuff "\015"'
screen -p 0 -s mc -X eval 'stuff "playsound ui.toast.challenge_complete master @a\015"'
sleep 5
screen -p 0 -S mc -X eval 'stuff "title @a title {"'
screen -p 0 -S mc -X stuff \"text\":\"§b§l§n再起動§rは§e§l§n約5分§rで終了します。\"}
screen -p 0 -S mc -X eval 'stuff "\015"'
sleep 5