runitサービスの自動再起動の速度を制御するにはどうすればよいですか?


8

このrunitサービスrunlog/runスクリプトが適切に機能しています。

偶然にも、サービス自体が外部の理由でクラッシュする可能性があり、何分も開始できない場合があります。runitがこの状況を処理するデフォルトの方法は、数秒ごとにサービスを再起動することです。この動作を変更するにはどうすればよいですか?

私の最後の洞察は、checkスクリプトを追加してそこに魔法をかけることでしたが、本来よりもはるかに複雑に思えます。より簡単な方法はありますか?

回答:


3

私はこの機能に精通していませんが、この問題を解決することが私の仕事であり、非常に短いmanページの読み取りでこの動作を調整するための単純なノブが提供されなかった場合、次のようにします。

既存のサービス開始スクリプトを拡張するか、それが面倒な場合は、新しい開始スクリプトをチェーンに挿入します(これにより、元の開始スクリプトが開始されます)。新しい開始スクリプトは、サービスをすぐに開始する代わりに、最後の開始が十分最近行われたかどうかを確認する必要があります。これは、前回の起動で作成されたシグナリングファイルをチェックすることで実行できます。ファイルが存在しない場合、スクリプトはファイルにアクセスしてサービスを開始できます。ファイルが存在する場合、スクリプトはファイルが十分古いかどうかを確認する必要があります。十分に古くない場合は、ファイルが十分に古くなるまでループで待機(スリープ)する必要があります。

このようなものが機能する可能性があります(再起動の間に少なくとも1分間待機します)。

#!/bin/bash

SIGNALDIR=/tmp
SIGNALFILE=service.started

while /bin/true; do
        found=`find "${SIGNALDIR}" -maxdepth 1 -name "${SIGNALFILE}" -mmin -1 | wc -l`
        [ "${found}" -eq 0 ] && break
        echo "Waiting"
        sleep 10
done

touch "${SIGNALDIR}/${SIGNALFILE}"
original service start...

それは良いアプローチです。テストしたらすぐに、必要な修正を加えたスクリプトを作成します。
jpbochi 2014年

8

./finish異常終了時に実行されるそのサービスのファイルで、再起動をレート制限する必要があります。./finishスクリプトからの戻りコードを受け取ります./run言えば、あなたがしている必要がありますなど、あなたが何をすべきかを決定することができそこから./finishスクリプトが失敗について大声で叫んと通知を送信し、火にすべての周りをジャンプ...


ありがとうこれは正しい答えですが、残念ながらpython、rubyなどを使用する現代のプログラマーは、unixシグナルに注意を払わず、適切な終了コードをまったく提供しないアプリを常に作成しているようです。
figtrap

1
返されたエラーコードはどうやら「クールではない」と思いますか?
Avery Payne、

それのように思えます。私自身、それは大きな後退だと思います。
figtrap 2018年

1

私は本当にinitベースのプロセス管理のファンではありません(そして、runitは基本的にinitの代替です)。発見したように、失敗したプロセスが死ぬとすぐに再起動することは、特に良い戦略ではありません。私はinitを使用してmonitを再起動しましたが、それは可能な限りです。(潜在的にOOMキラーはモニターを殺す可能性があります)。

したがって、パッチを当てるのではなく、代わりのものを探すことをお勧めします。

Monitはかなり古くなっていますが、うまく機能しており、これ以上うまくいくことがわかりません。起動後により多くのメモリをmallocする必要がないという優れた機能を備えているので、スクリプト言語で書かれたものを打ち負かすことができます。最後に必要なのは、メモリを取得できないためにプロセスモニターが停止していることです。


EL7や他のほとんどのディストリビューションに含まれているsystemdは、このような状況やさまざまな類似の状況を膨大な数のオプションでネイティブに処理でき、これらのようなプロセスマネージャーを廃止します。
マイケルハンプトン

1
systemdがターゲット環境に対して「大きすぎる」可能性がある状況が少しあります。そして、「実行するまで再起動することによるプロセス管理」の古い方法は、適切な依存関係の解決によってほとんど取って代わられました。例については、skarnet.org / software / s6 -rcおよびjjacky.com/anopaを参照してください。
Avery Payne
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.