回答:
Upstart Cookbookでは、ポストストップ遅延(http://upstart.ubuntu.com/cookbook/#delay-respawn-of-a-job)を推奨しています。respawn
引数なしでスタンザを使用すると、永遠に試行し続けます:
respawn
post-stop exec sleep 5
(私はこれをUbuntuの質問に答えました)
指数関数的な遅延部分を追加するには、ポストストップスクリプトで環境変数を操作してみます。
env SLEEP_TIME=1
post-stop script
sleep $SLEEP_TIME
NEW_SLEEP_TIME=`expr 2 \* $SLEEP_TIME`
if [ $NEW_SLEEP_TIME -ge 60 ]; then
NEW_SLEEP_TIME=60
fi
initctl set-env SLEEP_TIME=$NEW_SLEEP_TIME
end script
**編集**
再スポーン時にのみ遅延を適用し、実際の停止時の遅延を回避するには、現在の目標が「停止」かどうかを確認する次を使用します。
env SLEEP_TIME=1
post-stop script
goal=`initctl status $UPSTART_JOB | awk '{print $2}' | cut -d '/' -f 1`
if [ $goal != "stop" ]; then
sleep $SLEEP_TIME
NEW_SLEEP_TIME=`expr 2 \* $SLEEP_TIME`
if [ $NEW_SLEEP_TIME -ge 60 ]; then
NEW_SLEEP_TIME=60
fi
initctl set-env SLEEP_TIME=$NEW_SLEEP_TIME
fi
end script
post-start
、これを1にリセットするために
既に述べたようにrespawn
、リスポーンをトリガーするために使用します。
ただし、Upstart Cookbookrespawn-limit
の記事には、respawn limit unlimited
継続的な再試行動作を指定する必要があると書かれています。
デフォルトでは、プロセスが5秒以内に10回以上再生成されない限り、再試行します。
したがって、私は提案します:
respawn
respawn limit unlimited
post-stop <script to back-off or constant delay>
ロジャーの回答を改善しました。通常、基礎となるソフトウェアに問題が発生して短時間でクラッシュする場合にバックオフしますが、システムが回復したらバックオフ時間をリセットします。Rogerのバージョンでは、サービスは常に7秒間スリープします。これは、7回のクラッシュ後の単一および個別のクラッシュでも同様です。
#The initial delay.
env INITIAL_SLEEP_TIME=1
#The current delay.
env CURRENT_SLEEP_TIME=1
#The maximum delay
env MAX_SLEEP_TIME=60
#The unix timestamp of the last crash.
env LAST_CRASH=0
#The number of seconds without any crash
#to consider the service healthy and reset the backoff.
env HEALTHY_TRESHOLD=180
post-stop script
exec >> /var/log/auth0.log 2>&1
echo "`date`: stopped $UPSTART_JOB"
goal=`initctl status $UPSTART_JOB | awk '{print $2}' | cut -d '/' -f 1`
if [ $goal != "stop" ]; then
CRASH_TIMESTAMP=$(date +%s)
if [ $LAST_CRASH -ne 0 ]; then
SECS_SINCE_LAST_CRASH=`expr $CRASH_TIMESTAMP - $LAST_CRASH`
if [ $SECS_SINCE_LAST_CRASH -ge $HEALTHY_TRESHOLD ]; then
echo "resetting backoff"
CURRENT_SLEEP_TIME=$INITIAL_SLEEP_TIME
fi
fi
echo "backoff for $CURRENT_SLEEP_TIME"
sleep $CURRENT_SLEEP_TIME
NEW_SLEEP_TIME=`expr 2 \* $CURRENT_SLEEP_TIME`
if [ $NEW_SLEEP_TIME -ge $MAX_SLEEP_TIME ]; then
NEW_SLEEP_TIME=$MAX_SLEEP_TIME
fi
initctl set-env CURRENT_SLEEP_TIME=$NEW_SLEEP_TIME
initctl set-env LAST_CRASH=$CRASH_TIMESTAMP
fi
end script
あなたが望むrespawn limit <times> <period>
-これはあなたが探している指数関数的な振る舞いを提供しませんが、おそらくほとんどのユースケースでそれを行うでしょう。あなたは、のために非常に大きな値を使用してみてくださいtimes
とperiod
あなたが達成しようとするものを近似します。参考としてman 5 initのセクションrespawn limit
を参照してください。
respawn limit 10 3600
、デフォルトで遅延がないため、10回の試行を使用してもすぐに使い果たされる可能性があることを意味すると思います。
他の人がリスポーンとリスポーンの制限スタンザの質問に答えましたが、再起動間の遅延を制御するポストストップスクリプト用の独自のソリューションを追加したいと思います。
Roger Dueckが提案するソリューションの最大の問題は、遅延が原因で 'restart jobName'がスリープが完了するまでハングすることです。
さらに、スリープするかどうかを決定する前に、進行中の再起動があるかどうかを確認します。
respawn
respawn limit unlimited
post-stop script
goal=`initctl status $UPSTART_JOB | awk '{print $2}' | cut -d '/' -f 1`
if [[ $goal != "stop" ]]; then
if ! ps aux | grep [r]estart | grep $UPSTART_JOB; then
sleep 60
fi
fi
end script
never give up trying to respawn
未回答のままです。誰でも?