回答:
私はこの機能に精通していませんが、この問題を解決することが私の仕事であり、非常に短い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...
./finish
異常終了時に実行されるそのサービスのファイルで、再起動をレート制限する必要があります。./finish
スクリプトからの戻りコードを受け取ります./run
言えば、あなたがしている必要がありますなど、あなたが何をすべきかを決定することができそこから./finish
スクリプトが失敗について大声で叫んと通知を送信し、火にすべての周りをジャンプ...
私は本当にinitベースのプロセス管理のファンではありません(そして、runitは基本的にinitの代替です)。発見したように、失敗したプロセスが死ぬとすぐに再起動することは、特に良い戦略ではありません。私はinitを使用してmonitを再起動しましたが、それは可能な限りです。(潜在的にOOMキラーはモニターを殺す可能性があります)。
したがって、パッチを当てるのではなく、代わりのものを探すことをお勧めします。
Monitはかなり古くなっていますが、うまく機能しており、これ以上うまくいくことがわかりません。起動後により多くのメモリをmallocする必要がないという優れた機能を備えているので、スクリプト言語で書かれたものを打ち負かすことができます。最後に必要なのは、メモリを取得できないためにプロセスモニターが停止していることです。