Bungeecord鯖をShellScriptを使って起動・停止させる

# Minecraft鯖のスクリプトについて
BungeeCord鯖用のスクリプトを考えるにあたってそもそも作っている方いらっしゃらないかな？と思い検索したところやはりいらっしゃりました。
https://minecraft.server-memo.net/alma_java_minecraft_server_install/

こちらをもとに「簡易バックアップ」と「フルバックアップ」機能を排除，「再起動」機能を追加したコードになります。
```bash
#!/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のメモリ割り当ては不要なのでその修正...をします。
```bash
#!/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 
```
ざざっとコメント等も修正したわけですが...まぁ，動かしてみましょう。
# 不具合発生
なぜか停止コマンドを実行すると無限ループから抜け出せなくなってしまいました。セッション終了などを使って一度セッションを止めてログを見に行ってみましょう。
```logs
21:39:13 [INFO] [/107.178.234.85:49432] <-> InitialHandler has pinged
>
21:55:57 [INFO] Command not found
```
## コマンドが実行できていない判定になっている？
はい，なぜかendのみうまく実行できないようです...諦めるか...？
いえ，そんな必要はありません。

Google先生に質問したところ[こちらのスレッド](https://www.spigotmc.org/threads/tmux-with-bungee-cord.2702/#post-30232)を発見しました。中身を見ているとやはりendコマンドを実行できないということに悩んでる方が質問していました。

面倒くさがりが勝って回答を即見に行った結果...
```bash
tmux send-keys -t $SESSION_NAME:0 "e"
tmux send-keys -t $SESSION_NAME:0 "nd" C-m
```
と書き換えるだけで修正できました。

皆さんも同じ不具合(もしかしたら仕様)にはまった場合はこのようにすることで改善されるかと思います。
# 最後に...
restartコマンドをガバチョンで作ったため同一処理を二回書いてしまっていますが...仕方ないということにしましょうｗ
誤字等ありましたら，コメントなどで教えていただけるとありがたいです。(夜にばああああああと書いたので...)