初めに
マイクラサーバーを自分のPCに立てたけど、複数人でやるとき自分がいちいちPCで起動、終了コマンド打つのめんどいなーと思ってこの記事を書きました。24時間鯖起動は電気代的にちょっと...って人向けです。
*PCは24時間起動で常に自分のディスコードBOTが動くことを想定しています。
*マイクラ以外でも同じPCで実行するものなら何でもできます。
この記事でできること
- ディスコードでコマンドを入力すると自動的にマイクラ鯖が起動、終了します。
- いま鯖が起動しているかどうかもコマンドで確認できます。
もし起動コマンドを2連続で打っても1回しか起動しませんので安心してください。
この記事で解説していないこと
- マイクラ鯖の構築方法
サーバー起動シェルスクリプト作成
みなさんが普段入力しているサーバーの起動コマンドがあると思いますので、コマンドを記述したシェルスクリプトファイルを作成します。
僕の場合のコマンド↓
java -Xms20G -Xmx20G -jar mohist-1.20.1-550-server.jar
以下にshファイルを記述しますが、ご自分のコマンドに適宜変えてください。
また、このshファイルは裏画面でCLIを起動し、コマンドを実行させています。
shファイルは普段起動コマンドを実行しているディレクトリに配置してください
shファイルは今回
"dsc_run.sh"
"dsc_status.sh"(サーバーが今起動しているか確認するよう)
"dsc_stop.sh"
の3つ作成します。
dsc_run.sh
#!/bin/bash
# スクリーンセッションの名前を定義
SESSION_NAME="minecraft_server"
# 既にスクリーンセッションが存在するか確認
if screen -list | grep -q "\.$SESSION_NAME"; then
echo "サーバーが既に起動しています。"
else
# スクリーンセッションを作成してサーバーを開始
screen -dmS $SESSION_NAME java -Xms20G -Xmx20G -jar mohist-1.20.1-550-server.jar
sleep 10 # 10秒待つ
echo "サーバーが起動しました。"
fi
dsc_status.sh
#!/bin/bash
# スクリーンセッションの名前を定義
SESSION_NAME="minecraft_server"
# 既にスクリーンセッションが存在するか確認
if screen -list | grep -q "\.$SESSION_NAME"; then
echo "サーバー:起動中"
else
echo "サーバー:停止中"
fi
dsc_stop.sh
#!/bin/bash
# スクリーンセッションの名前を定義
SESSION_NAME="minecraft_server"
# スクリーンセッションが存在するか確認
if screen -list | grep -q "\.$SESSION_NAME"; then
# サーバーを停止する
screen -S $SESSION_NAME -p 0 -X stuff "stop$(printf \\r)"
sleep 10 # 10秒待つ
# スクリーンセッションを終了
#screen -S $SESSION_NAME -X quit
echo "サーバーが停止しました。"
else
echo "サーバーは起動していません。"
fi
ディスコードBOT作成
コマンドが来たとき、上で作成したshファイルを実行するようにBOTを動かしているpythonファイルを書き換えます。
作成まではここで解説されています。
dir_pathにはshファイルがあるディレクトリのパスを記述してください
async def on_messageの中のif分岐を追加
import os
import subprocess
dir_path = "YOUR PATH" #shファイルのパスを記述
#メッセージ受信で起動する関数
@client.event
async def on_message(message):
try:
if message.content.startswith('!micra_run'):
await message.channel.send('マイクラサーバー起動中・・・')
# シェルスクリプトを実行し、標準出力を受け取る
result = subprocess.run(f'cd {dir_path} && ./dsc_run.sh', shell=True, capture_output=True, text=True)
await message.channel.send(result.stdout)
if message.content.startswith('!micra_stop'):
await message.channel.send('マイクラサーバー停止中・・・')
result2 = subprocess.run(f'cd {dir_path} && ./dsc_stop.sh', shell=True, capture_output=True, text=True)
await message.channel.send(result2.stdout)
if message.content.startswith('!micra_status'):
result3 = subprocess.run(f'cd {dir_path} && ./dsc_status.sh', shell=True, capture_output=True, text=True)
await message.channel.send(result3.stdout)
今回はコマンドを!micra_runのようにしています。
ディスコードからコマンド入力
ディスコードBOTを起動させて以下のコマンドを実行しました
おわりに
クラウドが主流になりつつある現代で24時間PCを起動させてる人少ないと思いますが(僕はPCが余っていたのでローカルでやっています)、これでディスコード鯖にいる人なら誰でもマイクラを起動させることが出来るようになりました。友達とやるくらいなら使えるんじゃないかと思います。