web-dev-qa-db-ja.com

systemdサービスが再起動した場合にメールを送信するにはどうすればよいですか?

Systemdによってサービスとして実行される重要なアプリケーションがあります。

障害が発生するとすぐに再起動するように設定されています。

アプリケーションが再起動した場合にメールを送信するにはどうすればよいですか?

8
Greg

まず、2つのファイルが必要です。メールを送信するための実行可能ファイルと、実行可能ファイルを開始するための.serviceです。この例では、実行可能ファイルはsendmailを使用したシェルスクリプトです。

/usr/local/bin/systemd-email:

#!/bin/bash

/usr/bin/sendmail -t <<ERRMAIL
To: $1
From: systemd <root@$HOSTNAME>
Subject: $2
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8

$(systemctl status --full "$2")
ERRMAIL

使用する実行可能ファイルが何であれ、このシェルスクリプトが行うように、少なくとも2つの引数を取る必要があります。送信先のアドレスとステータスを取得するためのユニットファイルです。作成する.serviceは、次の引数を渡します。

/etc/systemd/system/[email protected]:

[Unit]
Description=status email for %i to user

[Service]
Type=oneshot
ExecStart=/usr/local/bin/systemd-email address %i
User=nobody
Group=systemd-journal

ここで、userは電子メールで送信されるユーザーであり、addressはそのユーザーの電子メールアドレスです。受信者はハードコードされていますが、レポートするユニットファイルはインスタンスパラメータとして渡されるため、この1つのサービスで他の多くのユニットにメールを送信できます。この時点で[email protected]を起動して、メールを受信できることを確認できます。

次に、メールを送信するサービスを編集し、OnFailure=status-email-user@%n.service[Unit]セクションに追加します。 %nは、ユニットの名前をテンプレートに渡します。

ソース: archlinux wiki:systemd timers MAILTO

14
gf_

SystemdサービスオプションのExecStartPostを使用してみてください。

説明はここにあります:

https://www.freedesktop.org/software/systemd/man/systemd.service.html

このオプションの宣言は、サービス定義ファイルでさらに記述できます。 1つずつトリガーされます。

システムにもいくつかの例があります。

0
Jaroslav Kucera