Minecraft鯖のスクリプトについて
BungeeCord鯖用のスクリプトを考えるにあたってそもそも作っている方いらっしゃらないかな?と思い検索したところやはりいらっしゃりました。
https://minecraft.server-memo.net/alma_java_minecraft_server_install/
こちらをもとに「簡易バックアップ」と「フルバックアップ」機能を排除,「再起動」機能を追加したコードになります。
#!/bin/bash
#
# minecraft_server start/stop/restart/status script
#
# mincraft_server.jar 実行ユーザ
USERNAME='root'
# session名
SESSION_NAME='minecraft'
# minecraft_serverディレクトリ
MC_PATH='/home/servers/minecraft'
# 実行するminecraft_server.jar
SERVICE='spigot-1.18.0.jar'
# メモリ設定
XMX='8G'
XMS='8G'
cd $MC_PATH
ME=`whoami`
if [ $ME != $USERNAME ]; then
echo "Please run the $USERNAME user."
exit
fi
# Minecraft 開始処理
start() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "$SERVICE is already running!"
else
echo "Starting $SERVICE..."
tmux new-session -d -s $SESSION_NAME
tmux send-keys -t $SESSION_NAME:0 "java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui" C-m
fi
}
# Minecraft 停止処理
stop() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
tmux send-keys -t $SESSION_NAME:0 "say SERVER SHUTTING DOWN IN 10 SECONDS." C-m
sleep 10
tmux send-keys -t $SESSION_NAME:0 "stop" C-m
sleep 10
echo "Stopped $SESSION_NAME server"
else
echo "$SERVICE is not running!"
exit
fi
while :
do
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
sleep 10
else
tmux kill-session -t $SESSION_NAME
echo "Stoped $SERVICE"
break
fi
done
}
# Minecraft 再起動処理
restart() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
tmux send-keys -t $SESSION_NAME:0 "say SERVER SHUTTING DOWN IN 10 SECONDS." C-m
sleep 10
tmux send-keys -t $SESSION_NAME:0 "stop" C-m
sleep 10
echo "Stopped $SESSION_NAME server"
else
tmux kill-session -t $SESSION_NAME
start
exit
fi
while :
do
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
sleep 10
else
tmux kill-session -t $SESSION_NAME
echo "Stoped $SERVICE"
start
break
fi
done
}
# Minecraft 起動状態確認処理
status() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "$SERVICE is already running!"
exit
else
echo "$SERVICE is not running!"
exit
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
esac
bungeecord用のスクリプトへ書き換える
bungeecordサーバーとspigotサーバーの違いは使用可能コマンドの違いです。このスクリプト内で言えばsay
コマンドとalert
コマンド,stop
コマンドとend
コマンドの違いです。
ならそれを書き換えてファイルの場所や.jarのファイル名,そもそもbungeecordに8GBのメモリ割り当ては不要なのでその修正...をします。
#!/bin/bash
#
# BungeeCord start/stop/restart/status script
#
# BungeeCord.jar 実行ユーザ
USERNAME='root'
# session名
SESSION_NAME='bungeecord'
# BungeeCord_serverディレクトリ
BC_PATH='/home/servers/bungeecord'
# 実行するBungeeCord.jar
SERVICE='BungeeCord.jar'
# メモリ設定
XMX='512M'
XMS='512M'
cd $BC_PATH
ME=`whoami`
if [ $ME != $USERNAME ]; then
echo "Please run the $USERNAME user."
exit
fi
# BungeeCord 開始処理
start() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "$SERVICE is already running!"
else
echo "Starting $SERVICE..."
tmux new-session -d -s $SESSION_NAME
tmux send-keys -t $SESSION_NAME:0 "java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui" C-m
fi
}
# BungeeCord 停止処理
stop() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
tmux send-keys -t $SESSION_NAME:0 "alert SERVER SHUTTING DOWN IN 10 SECONDS." C-m
sleep 10
tmux send-keys -t $SESSION_NAME:0 "end" C-m
sleep 10
echo "Stopped $SESSION_NAME server"
else
echo "$SERVICE is not running!"
exit
fi
while :
do
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
sleep 10
else
tmux kill-session -t $SESSION_NAME
echo "Stoped $SERVICE"
break
fi
done
}
# BungeeCord 再起動処理
restart() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
tmux send-keys -t $SESSION_NAME:0 "alert SERVER SHUTTING DOWN IN 10 SECONDS." C-m
sleep 10
tmux send-keys -t $SESSION_NAME:0 "end" C-m
sleep 10
echo "Stopped $SESSION_NAME server"
else
tmux kill-session -t $SESSION_NAME
start
exit
fi
while :
do
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "Stopping $SERVICE"
sleep 10
else
tmux kill-session -t $SESSION_NAME
echo "Stoped $SERVICE"
start
break
fi
done
}
# BungeeCord 起動状態確認処理
status() {
if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
echo "$SERVICE is already running!"
exit
else
echo "$SERVICE is not running!"
exit
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
esac
ざざっとコメント等も修正したわけですが...まぁ,動かしてみましょう。
不具合発生
なぜか停止コマンドを実行すると無限ループから抜け出せなくなってしまいました。セッション終了などを使って一度セッションを止めてログを見に行ってみましょう。
21:39:13 [INFO] [/107.178.234.85:49432] <-> InitialHandler has pinged
>
21:55:57 [INFO] Command not found
コマンドが実行できていない判定になっている?
はい,なぜかendのみうまく実行できないようです...諦めるか...?
いえ,そんな必要はありません。
Google先生に質問したところこちらのスレッドを発見しました。中身を見ているとやはりendコマンドを実行できないということに悩んでる方が質問していました。
面倒くさがりが勝って回答を即見に行った結果...
tmux send-keys -t $SESSION_NAME:0 "e"
tmux send-keys -t $SESSION_NAME:0 "nd" C-m
と書き換えるだけで修正できました。
皆さんも同じ不具合(もしかしたら仕様)にはまった場合はこのようにすることで改善されるかと思います。
最後に...
restartコマンドをガバチョンで作ったため同一処理を二回書いてしまっていますが...仕方ないということにしましょうw
誤字等ありましたら,コメントなどで教えていただけるとありがたいです。(夜にばああああああと書いたので...)