systemdで監視されたサービスが失敗状態になったときに通知を受け取ります


32

systemdサービスがクラッシュまたはハングした場合(つまり、障害状態になった場合、WatchdogSec =を使用してハングを監視します)、ネットワークメッセージを送信する必要があります。新しいsystemdにはFailureAction =があることに気付きましたが、これでは任意のコマンドが許可されず、再起動/シャットダウンのみが許可されることがわかりました。

具体的には、systemdがプログラムのクラッシュを検出したときに1つのネットワークメッセージを送信し、ハングしたことを検出したときに別のネットワークメッセージを送信する方法が必要です。

「ログを解析する」よりも良い答えを望んでいます。また、ほぼ瞬時に応答するものが必要なので、ポーリングのアプローチは良いとは思いません。発生するイベントによってトリガーされるものでなければなりません。


あなたが達成しようとしているものの例(機能していないものであっても)を提供していただけますか?
-dawud

質問を編集して、コメントに追加する代わりにこの情報を追加してください。:)
dawud

回答:


31

systemdユニットはOnFailureをサポートします。これは、ユニットが故障したときにユニット(またはそれ以上)をアクティブにします。次のようなものを置くことができます

 OnFailure=notify-failed@%n

そしてnotify-failed@.service、必要な指定子 (おそらく少なくとも%iが必要)を使用して通知を送信するスクリプトまたはコマンドを起動できるサービスを作成します。

実際の例はhttp://northernlightlabs.se/systemd.status.mail.on.unit.failureで見ることができます


5
リンクされたサイトの指示には、いくつかの修正が必要です。まず、notify%n.service冗長であり、結果がになりnotify@my-service.service.serviceます。次に、の%i代わりに使用する必要があり%Iます。そうしないと、名前のすべてのダッシュがスラッシュに変換されます。
orodbhen

4
ユニットファイルを変更せずに、複数またはすべてのユニットに対してこれを行う方法はありますか?
ウラジミールパンテレエフ

16

通知する私の方法:

/etc/systemd/system/notify-email@.service

[Unit]
Description=Sent email 

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c '/usr/bin/systemctl status %i | /usr/bin/mailx -Ssendwait -s "[SYSTEMD_%i] Fail" your_admin@company.blablabla'

systemdに追加します。

systemctl enable /etc/systemd/system/notify-email@service

他のサービスでは次を追加します。

[Unit]
OnFailure=notify-email@%i.service

設定をリロードします。

systemctl daemon-reload

連続して何度もトリガーしないようにする方法はありますか?場合によっては、夜間に失敗し、何度も何度も自分自身を再起動しようとしたサービスに関する1Kの電子メールを受信して​​も役に立ちません。
starbeamrainbowlabs

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.