Minecraft【サーバー】簡単なスクリプトで、マイクラサーバーを自動化。

2024-02-16

Macで動作確認。

スクリプトを使って作業を自動化し、サーバー運用の負担を減らす。

サーバーを作るのは簡単ですが、運用していくとなると手間がかかります。毎日パソコンとサーバーの起動、メンテのお知らせを入れて、時間が来たらサーバー停止。ワールドをバックアップして、溜まったログ削除...など。何かと作業が多くて面倒ですね。そんな繰り返しの作業を、スクリプトを使って自動化していきます。※Linuxでは動作未確認。

 

◻︎Windowsはこちら。

 

◻︎スクリプトで作業の自動化。
・複数のサーバーを同時に起動、終了。
・ワールドデータのバックアップ。
・古いログやバックアップの削除。
・タイムスケジュールでプログラムのループを作成。

 

目次

1.準備
・ターミナルの設定。
・フォルダの場所。
・スクリーン名の追加。

2.個別にスクリプトを作成
・再起動スクリプト。
・削除スクリプト。
・スクリプトを別のサーバーに複製。
・プロキシのスクリプト。

3.一括スクリプトを作成
・起動スクリプト。
・削除スクリプト。
・再起動スクリプト。
・停止スクリプト。
・その他。

4.スケジュール管理
・crontabの設定。

 

準備

ターミナルの設定。

ターミナルの環境設定から「シェルが正常に終了した場合は閉じる」に設定します。

 

フォルダの場所。


proxyは「velocity」を使用。serverは「PaperMC」を使い「lobby」と「build」の2つを使用。ワールド名も同じにしています。SSDドライブの直下にproxy、serverを設置。scriptと名前を付けた空フォルダも作っておきます。「jar」はアップデートの度にバージョン名を変えるのも面倒なので、単純化しておきます。※ファイルの場所やサーバー名は各自変更してください。例)paper-1.20.2-263.jar→paper.jar

 

スクリーン名の追加。

起動用スクリプト「lobby.command」にスクリーン名を追加して、シェルからプロキシやサーバーを操作出来るようにします。同じように「velocity」や「build」にもスクリーン名を追加しておきます。

◻︎lobbyの場合。

#!/bin/sh
cd "$(dirname "$0")"
screen -S lobby java -Xms2G -Xmx2G -jar paper.jar nogui

 

個別にスクリプトを作成

起動スクリプトと同じ場所に、ワールドをバックアップするための「backup」フォルダを作っておきます。サーバーを再起動するスクリプト「restart.command」とログやバックアップを削除する「delete.command」も作ります。※プロキシには「backup」フォルダは不要。

 

再起動スクリプト。

◻︎restart.command「lobby」の場合。
sleepを使って時間を調節。

#!/bin/sh
cd "$(dirname "$0")"
#サーバーの停止
screen -p 0 -S lobby -X eval 'stuff "say 30秒後にサーバーを再起動します。\015"'
screen -p 0 -S lobby -X eval 'stuff "say 終了後、約1分で再接続可能となります。\015"'
sleep 30
screen -p 0 -S lobby -X eval 'stuff "stop\015"'
#---------------------------
#ワールドのバックアップ
cp -r /Volumes/SSD/server/lobby/lobby /Volumes/SSD/server/lobby/backup
sleep 5
cd /Volumes/SSD/server/lobby/backup
zip -r `date "+%Y%m%d_%H%M"`.zip lobby
rm -r /Volumes/SSD/server/lobby/backup/lobby
#---------------------------
#サーバー起動
sleep 20
open /Volumes/SSD/server/lobby/lobby.command

◎サーバーの停止
スクリーン名「lobby」のサーバーにメッセージを流し、30秒後にサーバーを停止。
※プロキシでは「say」コマンドは使えません。

◎ワールドのバックアップ
「backup」フォルダにワールド名「lobby」をコピーして、日付を付け「zip」で圧縮。
コピーしたワールドを削除。※プロキシでは不要。

◎サーバー起動
20秒後にサーバー起動。※パソコンも再起動したい場合は不要。

純規の暇人趣味ブログ スクリプトを参考にさせていただきました。

 

削除スクリプト。

◻︎delete.command「lobby」の場合。

#!/bin/sh
cd "$(dirname "$0")"
# ログを削除
find /Volumes/SSD/server/lobby/logs -name "*.gz" -mtime +10 | xargs rm -f
#---------------------------
# ワールドを削除
find /Volumes/SSD/server/lobby/backup -name "*.zip" -mtime +10 | xargs rm -f

スクリプトを実行した時、10日以上前のログやバックアップしたワールドを削除します。※+10の数字を変えると、期間を変更出来ます。

fujimiyalog スクリプトを参考にさせていただきました。

 

スクリプトを別のサーバーに複製。

「lobby」サーバーで作ったスクリプト「restart.command」と「delete.command」を「build」サーバーに複製します。テキストエディタでスクリプトを開き「lobby」を「build」にすべて置換します。他にもサーバーがある場合は、同じ手順で複製していきます。

 

プロキシのスクリプト。

内容は「lobby」と同じ。不要な項目は削除。※ファイルパスが違うので注意。

◻︎restart.command「proxy」の場合。

#!/bin/sh
cd "$(dirname "$0")"
#プロキシの停止
sleep 30
screen -p 0 -S proxy -X eval 'stuff "stop\015"'
#---------------------------
#サーバー起動
sleep 20
open /Volumes/SSD/proxy/proxy.command

◻︎delete.command「proxy」の場合。

#!/bin/sh
cd "$(dirname "$0")"
# ログを削除
find /Volumes/SSD/proxy/logs -name "*.gz" -mtime +10 | xargs rm -f

 

一括スクリプトを作成

「script」フォルダの中に、プロキシやサーバーを一括で操作する、4つのスクリプトを作ります。個別で作ったスクリプトのファイルパスを指定するだけです。※ファイル名は各自変更。

 

起動スクリプト。

◻︎boot.command

#!/bin/sh
cd "$(dirname "$0")"
#プロキシ
open /Volumes/SSD/proxy/proxy.command
#---------------------------
#サーバー
open /Volumes/SSD/server/lobby/lobby.command
open /Volumes/SSD/server/build/build.command

パソコンを再起動した時、自動起動に使用。Mac/環境設定→ユーサーとグループ→ログイン項目に「boot.command」を登録。

 

削除スクリプト。

◻︎dell_all.command

#!/bin/sh
cd "$(dirname "$0")"
#プロキシ
open /Volumes/SSD/proxy/delete.command
#---------------------------
#サーバー
open /Volumes/SSD/server/lobby/delete.command
open /Volumes/SSD/server/build/delete.command

 

再起動スクリプト。

◻︎re_boot.command

#!/bin/sh
cd "$(dirname "$0")"
#サーバー
open /Volumes/SSD/server/lobby/restart.command
open /Volumes/SSD/server/build/restart.command
#---------------------------
#プロキシ
open /Volumes/SSD/proxy/restart.command

 

停止スクリプト。

◻︎stop.command

#!/bin/sh
cd "$(dirname "$0")"
#サーバー
screen -p 0 -S lobby -X eval 'stuff "stop\015"'
screen -p 0 -S build -X eval 'stuff "stop\015"'
#---------------------------
#プロキシ
screen -p 0 -S proxy -X eval 'stuff "stop\015"'

起動中のプロキシやサーバーを、一括で停止するスクリプト。自動化では使いませんが、作っておくと便利です。

 

その他。

◻︎あると便利なスクリプト。

繰り返して使う「今夜8時から緊急メンテを行います」など、メッセージ専用スクリプト。プラグインでも代用可能です。

更新頻度が多い、PaperMC(プラグインサーバー)、Geyser(統合版プラグイン)など、ダウンロードしたプログラムを各フォルダに一括で移動、複製するスクリプト。

 

スケジュール管理

一括起動出来るようになったスクリプトを「crontab」を使って、時間や日付で管理します。古いプログラムですが、時間を細かく管理出来るシンプルなプログラムは他にはありません。※一度設定しておくとパソコンを再起動しても消えません。

 

crontabの設定。

ターミナルで「crontab」を起動します。インサート(入力)モードにしてコマンドを入力。「crontab」を終了します。

◎crontabの起動
crontab -e
Enter
i

◻︎コマンド

MAILTO=""
0 4 * * * open /Volumes/SSD/script/re_boot.command
MAILTO=""
3 4 10,20,30 * * open /Volumes/SSD/script/dell_all.command

毎日午前4時0分に「re_boot.command」を実行します。毎月10日、20日、30日の午前4時3分に「dell_all.command」を実行します。※「MAILTO=""」 コマンド実行後のメール送信エラーを止め、シェルが閉じなくなるのを防ぎます。

◎crontabの終了
esc
:wq
Enter

crontabの終了後、ポップアップが出るので「OK」を押したら完了です。

cron wiki 詳しい時間の設定方法は、wikiページを確認。

 

◎その他オプション

#登録されたプログラムのリストを表示
crontab -l
#登録されたプログラムを全て削除
crontab -r