解決策 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 に役立つことを願っています。私を助けたその他のリンク:
<オール>