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 のエイリアスで指定したメールアドレス宛に、サービス終了通知とサービス開始通知のメールが届きます。