如何让新贵退缩而不是放弃

如何让新贵退缩而不是放弃

我希望 Upstart 做两件事:

  1. 不要这么快地尝试重生失败的进程
  2. 永不放弃重生

理想情况下,upstart 会在 1 秒后尝试重新启动一个停止的进程,然后在每次尝试时将延迟时间加倍,直到达到一个小时。

这样的事可能吗?

答案1

Upstart Cookbook 建议停止后延迟(http://upstart.ubuntu.com/cookbook/#delay-respawn-of-a-job)。使用respawn不带参数的节,它将永远继续尝试:

respawn
post-stop exec sleep 5

(我从这个 Ask 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

答案2

正如前面提到的,用来respawn触发重生。

但是,那Upstart Cookbook 的报道respawn-limit表示您需要指定respawn limit unlimited持续重试行为。

默认情况下,只要进程在 5 秒内重生不超过 10 次,它就会重试。

因此我建议:

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

答案3

我最终将一个放入start了 cronjob 中。如果服务正在运行,则它不起作用。如果它未运行,它将启动该服务。

答案4

您想要respawn limit <times> <period>- 虽然这不会提供您想要的指数行为,但它可能适用于大多数用例。您可以尝试使用非常大的值和timesperiod近似您想要实现的结果。请参阅人5初始化的部分respawn limit以供参考。

相关内容