systemd のサービスで OnFailure でメール通知

  • 7
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

下記のほぼそのまんまですけど、systemd のサービスで OnFailure でメール通知してみました。

環境は下記の通り。

  • centos-release-7-2.1511.el7.centos.2.10.x86_64
  • systemd-219-19.el7_2.11.x86_64

メールを送るためのサービスを作ります。

/etc/systemd/system/failure-email@.service

[Unit]
Description = failure email for %I

[Service]
Type = oneshot
ExecStart = /bin/sh -c 'systemctl status --full "$1"|mail -S sendwait -s "[$HOSTNAME]systemd failure $1" root' -- %i
User = nobody
Group = systemd-journal

適当にそれっぽいサービスのスクリプトを作ります。

/usr/local/bin/oreservice

#!/bin/bash
while sleep 1; do
    echo "hello oreservice"
done

実行属性を付けます。

chmod +x /usr/local/bin/oreservice

ユニットファイルを作ります。OnFailure に failure-email@%n.service を指定します。

/etc/systemd/system/oreservice.service

[Unit]
Description = oreservice
OnFailure = failure-email@%n.service

[Service]
Type = simple
Restart = always
ExecStart = /usr/local/bin/oreservice

[Install]
WantedBy = multi-user.target

systemd をリロードしてユニットファイルを読み込みます。

systemctl daemon-reload

サービスを開始します。

systemctl start oreservice.service
systemctl status oreservice.service

おもむろに殺します。

systemctl kill oreservice.service -s SIGKILL

メールで通知されたら成功です。


OnFailure = failure-email@%n.service

これは、ユニットが failure になったら failure-email@oreservice.service.service ユニットを開始する、という意味です。

failure-email@.service はアットマークを含むのでテンプレートユニットです。これを failure-email@oreservice.service.service のように呼び出した場合、ユニットの %i には oreservice.service が渡ります。

なので、下記のように直接実行してメールの通知を確認することもできます。

systemctl start failure-email@oreservice.service.service