GNU/Linux >> Linux の 問題 >  >> Linux

systemd サービスが再起動された場合にメールを送信する方法は?

解決策 1:

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

/usr/local/bin/systemd-email:

#!/bin/bash

/usr/bin/sendmail -t <<ERRMAIL
To: $1
From: systemd <[email protected]$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

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

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

出典:archlinux wiki:systemd timers MAILTO

解決策 2:

@gf_ によって提案されたソリューションは、CentOS7 でクリックハウスを実行している状況でうまく機能しました。 Clickhouse は定期的にクラッシュするため、自動的に再起動し、再起動が発生したときに通知を受ける必要がありました。 systemd に 2 つ目のサービスを追加するのは少し面倒に思えますが、これは systemd の設計上必要です。

そうは言っても、このソリューションを自動再起動と組み合わせると、CentOS8 にデプロイしたときに機能しなくなりました。これは、C8 で出荷された systemd v239 が OnFailure= に変更を導入したためです。 Restart= のデフォルト以外の構成と組み合わせた場合のセマンティクス (Restart=on-failure 私たちの場合には)。新しい OnFailure= 動作は、クラッシュ後だけでなく、再起動が完全に失敗した場合にのみワンショット サービスをトリガーします。この新しい動作は、サービスを喜んで再起動しますが、OnFailure= として電子メールを受け取ることはありません。 は呼び出されなくなりました。

私たちの主な期待に注意してください:systemd がプロセスを再起動し、電子メール通知を送信する必要がありました。 v239 の更新により、gf_ によって引用された以前のソリューションが機能しなくなりました。幸いなことに、これを機能させることができました。

私たちの解決策は ExecStopPost を使うことです 電子メール通知スクリプトを呼び出します。これは問題なく動作しますが、新しい問題が発生しました。サーバーの起動時など、クリックハウス サービスが正常に開始されたときに電子メール通知が送信されました。大したことではありませんが、理想的には、メール通知をのみ受け取りたいと考えていました クラッシュについて。メール スクリプトに次のコードを追加することで、これを実現できました。

# Don't do anything if the service intentionally stopped successfully. if [ $SERVICE_RESULT == "success" ]; then exit fi

... $SERVICE_RESULT ExecStopPost のターゲット プロセスに systemd によって提供される環境変数です。 . success をチェックすることによって その結果、この呼び出しは通常の起動またはシャットダウンからのものであると想定し、何もしません。 signal などのその他の値 、スクリプトは電子メールの送信を続行します。この変数の可能な値はドキュメントに記載されています。

最初の解決策を提供してくれた gf_ に感謝します。私の更新が CentOS8 に役立つことを願っています。私を助けたその他のリンク:

<オール>
  • https://superuser.com/questions/1360346/how-to-send-an-email-alert-when-a-linux-service-has-stopped
  • https://unix.stackexchange.com/questions/422933/confusing-systemd-behaviour-with-onfailure-and-restart
  • https://unix.stackexchange.com/questions/197636/run-an-arbitrary-command-when-a-service-fails

  • Linux
    1. Systemdのスタートアップスクリプトを書く方法は?

    2. Linux – SystemdでTtyを減らす方法は?

    3. Systemdサービスをパッケージ化する方法は?

    1. LinuxでSystemdサービスを一覧表示する方法

    2. ダウン時に Systemd を使用してサービスを再起動する方法は?

    3. systemd サービスを停止する方法

    1. LinuxでSystemctlを使用してSystemdサービスを管理する方法

    2. Systemctlコマンドを使用してSystemdサービスを管理する方法

    3. LinuxでSystemdサービスを作成する方法