Spigot(PaperMC)の再起動の話
最近マイクラへのモチベが湧いてきまして、なんとなくフォロワーとマルチをしてみようという機運になったんですよ。
善は急げということで、まずは1ヶ月、2,500円程度のVPSを契約。鯖立ては久しぶりすぎて浦島太郎だったので、インターネットに転がっていたチュートを参考にしながらなんとか軌道に乗せることに成功しました。
軌道に乗ったとは言っても、やはり避けられないのは負荷問題。案の定新規チャンク生成を繰り返すとすぐにメモリ不足になってサーバーが落ちてしまいます。
とどのつまり、再起動を繰り返すことになってしまうわけです。
当然ここで不満が出ます。/stop、tmux、attach…うわ〜〜〜面倒くさい!
じゃあ自動化すればいいじゃないかということで、いつも通りrestart.shに書くわけですよ。まあ、こんな記事を書く分、当然一筋縄ではいかないのです。何度attachを繰り返してもno sessionと返すだけで全く仕事をしてくれません。
本編
3日くらい悩んだ挙句、どうにか安定して再起動させる手法を発見しました。
「踏み台セッションを作成する」
です。
シェルスクリプトは2つ作ります。
restart.sh
#!/bin/sh
tmux new-session -ds restart ./start.sh #踏み台セッションで起動スクリプトを実行
start.sh
#!/bin/sh
sleep 5 #終了処理を待機してセッション名の重複を防ぐ
cd /paper #サーバーの階層へ移動
tmux new-session -ds Vanilla /usr/bin/java -jar paper.jar nogui #サーバー起動
tmux kill-session -t restart #踏み台セッションをkill
以上が私の解決方法でした。
ここに辿り着くまでに色々やったんですよ。sleepをかけたり、screenにしてみたり、起動引数を設定してみたり。
まあ、そんなものは結局意味がありませんでした。なぜなら、鯖の終了処理が終わり次第、セッションはkillされるので、そのセッションで動かしているスクリプトは途中で処理がキャンセルされてしまうのです。
何を当然のことをと思ってるかもしれませんが、これに気づくまでが長かった。
元のセッションが動いている間に踏み台を作成して、その踏み台で鯖の終了を待ち、元のセッションと同じ名前の新しいセッションを実行する。
これを思いつき、本当にその通り実行された時はアドレナリンドバドバだったなぁ…。