systemd の Service 起動時・停止時にメール通知を送る

前回のエントリーの続き。

Service の自動再起動設定がされている状態で、サービスの再起動が発生した場合にメール通知が飛ぶとうれしいなぁ、という事で調べてみると、同じ事を考えている人が既にいて、こんな感じで実現しています。 qiita.com

が、Apache 2.4 の場合、SIGKILL を送って強制終了した場合、Service のステータスとしては正常終了になってしまうので、OnFailure に書かれたユニットが起動してくれない、という問題にぶち当たりました。

それじゃあいっそ「Service 起動時・停止時に必ずメール通知を送る」ようにしてやろうじゃないか、というのが今回のエントリーの内容です。

通知用のテンプレートユニットを作る

先に、起動時通知用・停止時通知用のテンプレートユニットを作ります。

/etc/systemd/system/service-start-notify@.service

[Unit]
Description = service start notification for %I

[Service]
Type = oneshot
ExecStart = /bin/sh -c 'systemctl status --full "$1" | mail -s "[%H] $1 start" notice' -- %i
User = nobody
Group = systemd-journal

/etc/systemd/system/service-stop-notify@.service

[Unit]
Description = service stop notification for %I

[Service]
Type = oneshot
ExecStart = /bin/sh -c 'systemctl status --full "$1" | mail -s "[%H] $1 stop" notice' -- %i
User = nobody
Group = systemd-journal

mailコマンドで指定している宛先は、通知したいメールアドレスをべた書きしても良いですし、alias を指定しても大丈夫。今回は notice という名前でエイリアスを作って、そこに送るようにしています。

ファイルを作ったら、リロードして有効化します。

$ sudo systemctl daemon-reload

Service の設定を修正する

続いて、Apache2 の Service 設定を修正します。

sudo systemctl edit apache2

でエディタを起動して、以下の内容を追記します。

[Service]
ExecStartPost=/bin/sh -c "systemctl start service-start-notify@$1.service" -- %n
ExecStopPost=/bin/sh -c "systemctl start service-stop-notify@$1.service" -- %n

名前でなんとなく想像出来ると思いますが、ExecStartPost がサービス起動後に実行されるコマンド、ExecStopPost がサービス終了後に起動されるコマンドです。ExecStopPost は正常停止・異常停止のいずれの場合でも実行されるので、Service が止まった場合は必ずメール通知が飛ぶ仕掛けになっています。

この状態で Apache のプロセスを殺すと、notice のエイリアスで指定したメールアドレス宛に、サービス終了通知とサービス開始通知のメールが届きます。