Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

Ubuntu・Debianで再起動が必要な際に知らせてくれるMackerelのチェックプラグイン

家でいくつか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のチェックプラグインを自作してこの状態に気づけるようにしてみました。

github.com

使い方

このチェックプラグインは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
}

実際の実装も非常にシンプルなコードになっているので、チェックプラグインを自作してみたい人はぜひリポジトリを参考にしてください。