回答:
まず、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/status-email-user@.service:
[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つのサービスで他の多くのユニットにメールを送信できます。この時点でstatus-email-user@dbus.service
、メールを受信できるかどうかの確認を開始できます。
次に、メールを送信するサービスを編集OnFailure=status-email-user@%n.service
し、[Unit]
セクションに追加します。%n
ユニットの名前をテンプレートに渡します。
ExecStartPost
正しい選択かどうかはわかりません。「通常の」起動後にもトリガーされます。失敗した場合だけでなく、 ?
@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
は、systemdによってのターゲットプロセスに提供される環境変数ですExecStopPost
。success
結果を確認することにより、この呼び出しは通常の起動またはシャットダウンからのものであると想定し、何もしません。などの他の値でsignal
は、スクリプトはメールの送信を続行します。この変数の可能な値は、ドキュメントに記載されています。
最初の解決策を提供してくれたgf_に感謝します。私のアップデートがCentOS8に役立つことを人々に知ってもらいたい。私を助けてくれたいくつかのリンク:
systemdサービスオプションのExecStartPostを使用してみてください。
説明はここにあります:
https://www.freedesktop.org/software/systemd/man/systemd.service.html
このオプションの宣言は、サービス定義ファイルでさらに記述できます。1つずつトリガーされます。
システムにもいくつかの例があります。
シェルスクリプトを作成して、サービスのステータスを確認し、サーバーの起動中にメールを送信できます。このリンクはあなたを助けるかもしれません