サーバに誰もログインしていないかを任意の時間に確認し、条件を満たせばMinecraftサーバを自動再起動するPowerShellスクリプトの紹介

ゲーム

やりたいこと

  • 任意の時間に自動チェック(タスクスケジューラを使用)
  • サーバに誰もログインしていなかったらMinecraftサーバを自動的に再起動

スクリプトの内容紹介

以下が今回作成したシェルスクリプトの中身です。
シェルの中身を簡単に紹介します。
①ログ設定
 1.$logDir = “【ログの保存先】”
  →ログファイルを保存するディレクトリのパスを指定します。
 2.$logFile = Join-Path $logDir (“restart_log_” + (Get-Date -Format “yyyy-MM-dd”) + “.log”)
  →Join-Path$logDir とファイル名を結合し、その日のログファイルパスを作成します。
 3.if (!(Test-Path $logDir)) { … }
  →指定したログディレクトリが存在しない場合に新しく作成します。
 4.function Log { … }
  →Log という関数を定義して、ログを標準出力(画面)とファイルの両方に出力できるようにします。
  →$timestamp で現在時刻を取得(例: 2025-04-30 10:15:23)
 ②スクリプト主要処理
 1.RCONの設定を記述
  2.現在のログインユーザ数をカウント
  →0人の場合
   →再起動(起動している”java”プロセスをタスクキル”の処理後、マイクラサーバの開始バッチの実行処理)
  →0人でない場合
    →再起動処理のスキップ
 ③ログローテーション設定
  一ヶ月以上経過したログを削除する

#=== ログ設定 ===#
$logDir = "【ログの保存先】"
$logFile = Join-Path $logDir ("restart_log_" + (Get-Date -Format "yyyy-MM-dd") + ".log")

if (!(Test-Path $logDir)) {
New-Item -Path $logDir -ItemType Directory | Out-Null
}

# ログ出力用関数
function Log {
param ([string]$message)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"$timestamp - $message" | Tee-Object -FilePath $logFile -Append
}

#=== スクリプト開始 ===#
Log "=== マイクラ再起動チェック開始 ==="

# RCON設定
$rconHost = "【rconHostIPアドレス】"
$rconPort = 【rconPort 使用ポート】
$rconPassword = "【rconPassword】"

function Send-RconCommand {
param(
[string]$command
)
$result = & "【任意のパス】\mcrcon.exe" -H $rconHost -P $rconPort -p $rconPassword $command
return $result
}

$listOutput = Send-RconCommand "list"
Log "RCON出力: $listOutput"

if ($listOutput -match "There are (\d+) of a max") {
$playerCount = [int]$matches[1]
Log "現在のプレイヤー数: $playerCount"

if ($playerCount -eq 0) {
Log "10秒待機後に再起動します。"
Start-Sleep -Seconds 10

Stop-Process -Name "java" -Force
Start-Sleep -Seconds 5
Start-Process -FilePath "【マイクラサーバの起動バッチ】"
Log "サーバー再起動を実行しました。"
} else {
Log "プレイヤーがいるため、再起動をスキップしました。"
}
} else {
Log "プレイヤー数の取得に失敗しました。"
}

Log "=== マイクラ再起動チェック終了 ==="

#=== 古いログの削除(30日より前)===#
Get-ChildItem -Path $logDir -Filter "restart_log_*.log" | Where-Object {
$_.LastWriteTime -lt (Get-Date).AddDays(-30)
} | Remove-Item -Force

タスクスケジューラで定期実行

このスクリプトはタスクスケジューラで任意の時間に自動実行するよう設定しておくのがオススメです。たとえば毎日午前4時にチェックするように設定すれば、プレイヤーが寝ている間に自動で再起動され、快適なプレイ環境を保てます。


⚠ 注意点

  • Minecraftサーバをバッチファイルで起動している場合、パスやファイル名を適宜変更してください。
  • サーバが他のjavaサービスも兼ねている場合は注意して使用してください。丸ごと停止します。
  • 今回の方法では「RCON」を使用してサーバ内の情報を取得します。有効で無い場合は有効にしてください。

おわり

コメント

タイトルとURLをコピーしました