LoginSignup
3
2

More than 3 years have passed since last update.

Minecraftサーバーにシェルスクリプトからコマンド入力 #bash #Minecraft #screen

Last updated at Posted at 2021-02-22

Minecraftサーバーにシェルスクリプトからコマンド入力する方法

マイクラのサーバーを管理することになったので, シェルスクリプトからコマンドを実行できるようにしました.

screen で実行する

こちらの記事を参考にしつつ, マイクラを screen で実行します.

#!/bin/bash

screen -UAmdS minecraft java -server -jar server.jar nogui

Javaのオプションはそれぞれ良い感じに設定して下さい.
このようにすることで, マイクラサーバーを screen 上で起動できます.

minecraft の部分はスクリーン名です. 自分の分かりやすい名前に設定しましょう.

シェルスクリプトからマイクラのコマンドを飛ばす

次にシェルスクリプトからマイクラのサーバーに向けてメッセージを飛ばしてみたいと思います.

hello.sh
#!/bin/bash

screen -p 0 -S <スクリーン名> -X eval 'stuff "say Hello World!\015"

<スクリーン名> は上で設定したものに置き換えて下さい.
このようにすると, マイクラのサーバーでプレイしているユーザーに向けてメッセージを送ることができます.

同じように, 以下のスクリプトを実行することで, マイクラのサーバーをシェルスクリプトからシャットダウンすることができます.

shutdown.sh
#!/bin/bash

screen -p 0 -S <スクリーン名> -X eval 'stuff "stop\015"'

stuff の後ろの部分がマイクラのサーバーの標準入力に流し込まれるという形で動作します.
なお, \015 は改行コードです.

Raw JSON が必要なコマンドの実行

ここまでは、先ほどの記事に書いてあった通りなのですが, マイクラの title コマンドを使おうとすると, ダブルクオート(")がうまく入力できず, 苦労しました.

Qiitaでも調べてみると, 同じ悩みを抱えている方を発見しました.

根気よくググり続けていると, これを解決している海外の記事を発見することができました.

以下のようにすることで, ダブルクオートが必須である Raw JSON を引数とするようなコマンドを実行できます.

notif.sh
#!/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による通知を併用することも可能です.

以下は再起動用シェルスクリプトの一例です.

restart.sh
#!/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
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2