communication-g7396f4352_1280

※この記事はMisskeyあたりの運用を想定して書いていますが、特にそれに限らないトピックだとは思います。

(お一人様想定だと)Misskeyを使っているとメモリ使用量が少しずつ増えていくわけですが、それが1日もすれば2GB程度になる感じがあり、これがサーバースペックを選択する際の指標の一つになっていました。

サーバースペックの選択肢としては、頻繁な再起動の手間を我慢して2GBのVPSを使うか、出費を代償に手間を省略して3GBなり4GBのVPSを契約するか……の2択になりますかね。

このときコストを考慮した場合には、(メモリ消費量が100%に至ってしまうと動作面において問題が生じることが予想されるため)定期的に再起動をしてメモリの消費具合をリセットしていくことになるんですが……これがまぁ面倒です。

そこで、そうした運用もしくは類する状況の場合に、ちょっとでも手間を省くべく「cronを使って定期的かつ自動的にVPSを再起動する」ようにしてみます。

Ubuntu環境を想定しています。

本題に入る前に補足

記事公開時は上述のような状況でした。

現在はこれらの記事(記事1記事2記事3)にあるように、メモリアロケーターというものを切り替えることで2GB以内にメモリ消費を抑えることが現実的になったため、Misskeyのメモリ消費量がネックでこの記事を見つけた場合は、上記の記事を参考にメモリアロケーターの変更を検討したほうがいいかもしれません。

すでに対応済みの場合/最近インストールして最初からメモリアロケーターがjemallocの場合……でまだメモリ消費量に悩まされているのなら、定時再起動はまだ有効かもしれません。

下準備: タイムゾーンがJSTか確認する

さて、作業を始める前にまずはサーバーのタイムゾーンを確認しましょう。

タイムゾーンはその名の通り、特定の標準時間を指標とした地域群を指します。 日本で言えば、日本時間とか日本標準時とかいわれるもの(JST)のことですね。

サーバーのこの設定がどこのものになっているかで、ログイン時に表示される時間や、(これから指定する)cronのスケジュールなどに影響するんですが、借りるVPSによってはJSTではなくUTC(協定世界時)などになっており、表示上時差が生じてしまっていることがあります。

なので、まずJSTかどうかをログイン時に表示されるものを見るか、

date

を実行して日時表示して確認してみてください。 ここでJSTが表示されれば次の項目へ進んでOKです。 ここでUTCなど「JST以外」のタイムゾーンが設定されているような場合は、設定の変更をしたほうがいいかもしれません(変更しなくても作業・設定はできますが、わかりにくいので……)。

私は「Ubuntu 22.04 LTS Server タイムゾーン 日本時間(JST)への変更手順」や「WebArena Indigo 環境設定4)時間設定の変更」あたりを参考に作業しました。

まず、以下のコマンドでタイムゾーンをJSTに設定します。

sudo timedatectl set-timezone Asia/Tokyo

続いて、今回の本目標であるcronのスケジュールもJSTに切り替えるため、次のコマンドを入力します。

私の場合はユーザーの認証が発生したので、パスワードを要求された場合は入力します。 パスワードを未設定の場合は、先にパスワードを設定してから臨んでください。

[Ubuntu]ターミナルコマンドでパスワードを変更するには?」などを参考のこと。

systemctl restart cron.service
systemctl restart rsyslog.service

これでcronのほうでもJSTでの時間指定ができるようになります。 以上で下準備は終了です。

cronに再起動のスケジュールを設定する

では、cronに自動で再起動を実行させるための設定をしていきます。 この作業では主に「【Ubuntu 18.04 LTS Server】定期的に再起動させる」を参考にしました。

cronは指定した条件の日時になったときに、設定したコマンドを実行してくれるものです。 今回は再起動ですが、定期的に特定のなにかをバックアップしたりなんだりということができます。

まずはシャットダウンをするためのフルパスを調べます。

which shutdown

自分の場合は「/usr/sbin/shutdown」という結果になりました。

続いて、実際にcronの設定を書き加えます。 以下のコマンドで設定をするためのファイルを開きます。

テキストエディターの選択(vimやnanoなど)が表示される場合は、任意のものを選んでください。

sudo crontab -e

ファイルが開いたら、スケジュールを書き込みます。 私の場合はこうしました。

0 4 * * * /usr/sbin/shutdown -r now

左側の数字やアスタリスク(*)がスケジュールの設定、続く文字列がシャットダウンをするためのフルパスの指定(さっき調べたフルパスを書いてください)……といったところです。

スケジュールは左から、

分 時 日 月 曜日

を示しています。 曜日は0を日曜日として、6が土曜日です(7も日曜日があてがわれています)。

なので……上記の私の例だと「毎日午前4時に再起動する」ということになりますね。

スケジュールの指定自体はハイフン(-)でつないだり(例: “分”の指定を0-30にすると、毎時0分から30分までの間実行する)、コンマ(,)で区切ったり(例: “時”の指定を0,12にすると、毎日0時と12時に実行する)、間隔を指定(例: “日”の指定を*/2にすると、2日ごとに実行する)……と、結構色々と指定できるようです。

詳しい書き方は「cronの日時指定を、基礎から学ぶ(分,時,日,月,曜日の指定、◯分ごと、月末起動、など)」や「crontabの書き方」が参考になります。

とりあえず、“分”の指定をアスタリスク(*)にしてしまうと、毎分実行してしまうようなので、それだけは注意です!

とはいえ、今回の目的は「毎日定期的に自動で再起動させる」くらいのものなので、さっきの私の例のようなシンプルな内容でもいいかなとは思います。 自分の場合は「自分がVPSを使わず、なおかつ人が少なそうな時間帯」ということで午前4時を指定してありますが、このあたりはご自身の生活リズムなどに合わせて指定してみてください。

設定が終わったら保存して終了してOKです。

あとは、“再起動されたであろう”あとのスキマ時間にでも以下のコマンドを入力してみましょう。

last reboot

表示された内容を確認して、指定した時間に再起動されていたようであれば設定は成功です。

sudo crontab -l

で実行内容を確認もできるので、もし動かない場合や設定の見直しをする場合はこちらのコマンドを使うのもいいでしょう。

ともあれ、以後はスケジュールに従って、自分自身がなにもしなくても再起動してくれるのでいくぶん楽になるかと。 ご自身の状況によっては日に2回とか、あるいは2日に1回とか指定するなどして、最適な設定をしてみるといいと思いますよ。