web-dev-qa-db-ja.com

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

runおよびlog/runスクリプトが正しく機能しているこのrunitサービスがあります。

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

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

8
jpbochi

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

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

このようなものが機能する可能性があります(再起動の間に少なくとも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...
3
Laszlo Valko

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

8
Avery Payne

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

したがって、パッチを適用するのではなく、代替品を探すことをお勧めします。

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

1
mc0e