家でいくつかRaspberry Piを飼っておりそれぞれにUbuntuをインストールしているのですが、ログインした際に以下のように「System restart required」と言われることがあります。
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-1044-raspi aarch64) (中略) *** System restart required *** Last login: Mon Jan 15 22:41:41 2024 from 192.168.100.18
Ubuntuはデフォルトでパッケージを自動更新するようで、カーネルなどが更新された際にSystem restart requiredの状態になるようです。せっかく自動更新しているのに再起動待ちで更新を反映できないと勿体無いので、Mackerelのチェックプラグインを自作してこの状態に気づけるようにしてみました。
使い方
このチェックプラグインはmkr install
に対応している(cf.) mkr plugin installでプラグインをインストールする - Mackerel ヘルプ)ので、まずは以下のようにしてプラグインをインストールしましょう。
sudo mkr plugin install Arthur1/check-debian-reboot-required
あとはmackerel-agent.confを書き換えてmackerel-agentのサービスを再起動するだけです。
+[plugin.checks.check-debian-reboot-required] +command = ["/opt/mackerel-agent/plugins/bin/check-debian-reboot-required"]
もしOSのrebootが必要な状態になっているなら、以下のようにアラートが発報されます。
このホストでsudo reboot
を実行すると、アラートがクローズされました。
実装
DebianやUbuntuではOSの再起動が必要な際に/var/run/reboot-requiredというファイルが生成されるようです。また、どのパッケージが要因なのかについても/var/run/reboot-required.pkgsというファイルに書き込まれています。
よって、チェック監視のプログラムではこれらのファイルの有無を見れば良いわけです。Go言語ではos.Stat()
とos.IsNotExist()
を利用することでファイルの有無を判定することができます。
if _, err := os.Stat("/var/run/reboot-required"); err == nil { // reboot is required } else if os.IsNotExist(err) { // reboot is not required } else { // unexpected error }
実際の実装も非常にシンプルなコードになっているので、チェックプラグインを自作してみたい人はぜひリポジトリを参考にしてください。