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


8

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

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

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


2
systemdでそれを行う方法はわかりませんが、monitを使用すると、プロセスを監視でき、プロセスIDが変更された場合に通知を送信できます。
Zoredache 2017

回答:


16

まず、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ユニットの名前をテンプレートに渡します。

ソース:archlinux wiki:systemd timers MAILTO


しかし、@ Daveは別のサービスを必要としません。彼は、すでに使用しているサービスが、起動/再起動のたびにメールを送信できるようにしたいと考えています。そのため、ExecStartPostオプションがあります。
Jaroslav Kucera 2017

@JaroslavKuceraこれはOPまで決めることだと思います... :)また、ExecStartPost正しい選択かどうかはわかりません。「通常の」起動後にもトリガーされます。失敗した場合だけでなく、 ?
gf_ 2017

なぜこれが反対票を投じられるのか興味があります-声を上げて声を上げてください!
gf_ 2017

問題は別のサービスではなく、既存のサービスの変更に関するものだからです。はい、ExecStartPostは通常の起動でもメール送信をトリガーします。再起動時にのみ機能するものは何も知りません。
Jaroslav Kucera 2017

@JaroslavKuceraまあ、それはOPが同意しないようですが、もちろん、あなたの意見を守ってください。
gf_ 2017

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は、systemdによってのターゲットプロセスに提供される環境変数ですExecStopPostsuccess結果を確認することにより、この呼び出しは通常の起動またはシャットダウンからのものであると想定し、何もしません。などの他の値でsignalは、スクリプトはメールの送信を続行します。この変数の可能な値は、ドキュメントに記載されています

最初の解決策を提供してくれたgf_に感謝します。私のアップデートがCentOS8に役立つことを人々に知ってもらいたい。私を助けてくれたいくつかのリンク:

  1. /superuser/1360346/how-to-send-an-email-alert-when-a-linux-service-has-stopped
  2. /unix/422933/confusing-systemd-behaviour-with-onfailure-and-restart
  3. /unix/197636/run-an-arbitrary-command-when-a-service-fails


-1

シェルスクリプトを作成して、サービスのステータスを確認し、サーバーの起動中にメールを送信できます。このリンクはあなたを助けるかもしれません

/ubuntu/814/how-to-run-scripts-on-start-up


1
この質問は、ブートに関するものではなく、サービスの再起動に関するものです。サービスの再起動は、ブート後にかなり時間がかかる場合があります。したがって、あなたの答えが何らかの助けになるかどうかはわかりません。
gf_ 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.