概要
cronからFabric製Minecraftサーバーを自動起動しようとした際、screen
上でサーバーが正しく起動しない事象が発生した。手動で実行する際は成功するにも関わらず、cronや他ディレクトリから実行すると失敗する。この原因と対処方法について記録する。
現象
以下のcronジョブを設定。
0 21 * * * /home/ubuntu/survival/restart.sh
このジョブは screen
上でFabricサーバーを起動するシェルスクリプトである。
スクリプトを /home/ubuntu/survival
ディレクトリ内で手動実行すれば正常に起動するが、/home/ubuntu
など別ディレクトリで実行すると起動しない。
原因
Java製のMinecraftサーバーは、実行時の「カレントディレクトリ(作業ディレクトリ)」に依存して、modsやconfig、worldデータなどを読み込もうとする。
スクリプト内で cd
を明示しないと、cronなどでの実行時には意図しないディレクトリ(例: /
や/home/ubuntu
)から起動されるため、必要なリソースが見つからず異常終了する。
対処法
スクリプト内で cd
を明示的に指定する。
#!/bin/bash
# 設定
SCREEN_NAME="fabric-server"
JAR_FILE="fabric-server-mc.1.20.1-loader.0.16.10-launcher.0.11.2.jar"
# サーバーディレクトリへ移動
cd /home/ubuntu/survival || exit 1
# すでにscreenが存在する場合は何もしない
if screen -list | grep -q "$SCREEN_NAME"; then
echo "The server is already running in screen session: $SCREEN_NAME"
exit 1
fi
# サーバーをscreenで起動
echo "Starting Fabric server in screen session: $SCREEN_NAME"
screen -dmS $SCREEN_NAME java -jar $JAR_FILE nogui
echo "Fabric server started successfully."
必要であれば、cron用に PATH
や JAVA_HOME
をスクリプト内で明示することも検討する。
補足:cron環境での注意点
- cronは非常に最小限の環境変数しか持たない
-
.bashrc
や.profile
に記載されたPATHは反映されない -
screen
やjava
コマンドがパスで解決できない場合があるため、絶対パスで記述するか、環境変数を設定すること