パルワールドのメモリ管理を自動化してみた
皆さんこんにちは!
株式会社ダイサン note担当者です。
前回、サーバのメモリ状態をDiscordへ自動で送る機能(シェル)について紹介しましたが、今回はメモリがカツカツになってきたら自動で再起動させるプログラムを作成しましたので紹介します!
▼ 前回記事
まずはメモリの空き状況を確認し、閾値(今回は1GB)を下回ったら再起動を行うプログラムを紹介します。
$ vi ~/pal-check.sh
#!/bin/bash
cd $(dirname $0)
# メモリ解放を実施
echo 1 > /proc/sys/vm/drop_caches
# メモリ使用量を確認
free=($(free -m | head -2 | tail -1))
# メモリの残りが 1000MB を切ったら、5分後に再起動を実施
if [ ${free[3]} -lt 1000 ]; then
sh pal-restart.sh 5
fi
再起動を行うプログラムは、間違えて実行してもキャンセルができるよう、ディレイをかけつつ、ワールドの保存・バックアップも実施して、万全を期します!
$ vi ~/pal-restart.sh
#!/bin/bash
cd $(dirname $0)
# 再起動ディレイを分単位で設定
time=${1:-1}
echo "Palworld will restart after ${time} minutes."
sleep $(( 60 * ${time} ))
sh pal-saveworld.sh # ワールドの保存
sh pal-backup.sh # ワールドのバックアップ
# パルワールドの再起動
systemctrl restart palworld-server.service
ワールドの保存は、rconコマンドで今回は実装しました。
$ vi ~/pal-saveworld.sh
#!/bin/bash
cd $(dirname $0)
alias RCON='rcon -a "IPアドレス:ポート番号" -p "rconパスワード"'
# Rmote CONtrol コマンドで保存を行う
RCON "Save"
続いて、バックアップを行うプログラムです。
無限にバックアップするのはスマートではないので、
上限を設けてそれ以上増えない様にします。
(事前にバックアップディレクトリを作成もしておきましょう)
$ mkdir /backup
$ vi ~/pal-backup.sh
#!/bin/bash
cd $(dirname $0)
alias hdate="date +'%Y%m%d-%H%M'"
# バックアップ保存先
readonly BK_PATH="/backup/save"
# バックアップ対象ディレクトリ
readonly PAL="/opt/palworld/Pal/Saved/SaveGames"
# バックアップ保持数
readonly SAVE_NUMS=20
# バックアップ実施(ディレクトリごとコピー)
cp -af ${PAL} ${BK_PATH}_$(hdate)
# 古いバックアップを削除
ls -td1 ${BK_PATH}_* | head -n ${SAVE_NUMS} | xargs rm -rf
ここまでの対策を行っておけば、何か問題が起きてもバックアップから戻せます!
この様にしてnote担当者はパルワールドのサーバ管理を行ってきました。
他にも良い方法があるかもしれませんが、一例として紹介させて頂きました。
今まで紹介したシェルの中には、過去の開発経験から得た技なども織り込まれています。
今後、シェルを書く上で便利な技の紹介等もしていきたいなと思っています♪