如何让起步回落,而不是放弃

我想要Upstart做两件事情:

  1. 停止尝试重build一个失败的过程如此之快
  2. 永不放弃试图重生

在一个理想的世界里,暴发户会试图在1秒后重新开始一个死亡的过程,然后在每次尝试时加倍延迟,直到达到一个小时。

是这样的可能吗?

    Upstart食谱build议推迟延期( http://upstart.ubuntu.com/cookbook/#delay-respawn-of-a-job )。 使用没有参数的respawn节,它将继续尝试永远:

     respawn post-stop exec sleep 5 

    (我从这个问Ubuntu的问题得到这个)

    要添加指数延迟部分,我会试着在post-stop脚本中使用一个环境variables,我想像这样:

     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 

    我结束了一个start在cronjob。 如果服务正在运行,则不起作用。 如果没有运行,则启动服务。

    如前所述,使用respawn触发重生。

    然而, Upstart Cookbook关于respawn-limit报道说,你需要指定respawn limit unlimited地持续重试行为。

    默认情况下,只要该进程在5秒内不会重新生成10次以上,就会重试。

    因此我会build议:

     respawn respawn limit unlimited post-stop <script to back-off or constant delay> 

    我对罗杰的回答做了一个改进。 通常情况下,如果底层软件出现问题,希望在短时间内崩溃,但一旦系统恢复后,您希望重置退避时间。 在Roger的版本中,服务总是会hibernate60秒,即使是在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> – 虽然这不会提供你正在寻找的指数行为,但它可能会为大多数的用例。 您可能会尝试使用非常大的timesperiod值来逼近您尝试实现的目标。 请参阅man 5 init的关于respawn limit的部分以供参考。

    其他人已经回答了respawn和respawn limit的问题,但是我想添加自己的解决scheme来控制重启之间的延迟。

    Roger Dueck提出的解决scheme最大的问题是,延迟导致'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