如何让暴发户退后,而不是放弃

fad*_*bee 24 ubuntu upstart

我想让 Upstart 做两件事:

  1. 停止尝试如此快速地重新生成失败的进程
  2. 永不放弃尝试重生

在理想的世界中,新贵会尝试在 1 秒后重新启动一个死进程,然后在每次尝试时将延迟加倍,直到达到一个小时。

这样的事情可能吗?

Rog*_*eck 30

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

respawn
post-stop exec sleep 5
Run Code Online (Sandbox Code Playgroud)

(我从这个 Ask Ubuntu question得到这个)

要添加指数延迟部分,我会尝试在 post-stop 脚本中使用环境变量,我认为是这样的:

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
Run Code Online (Sandbox Code Playgroud)

** 编辑 **

要仅在重生时应用延迟,避免真正停止时的延迟,请使用以下命令,检查当前目标是否为“停止”:

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
Run Code Online (Sandbox Code Playgroud)

  • 生产系统的问题在于,一旦达到最大值(60 秒),即使系统恢复正常,也总是需要 60 秒。也许可以通过“post-start”将其重置为 1。 (3认同)
  • @JamieCockburn 默认间隔不是 5 分钟,而是 5 **秒**。 (2认同)

小智 5

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

但是,Upstart Cookbook 报道respawn-limit说您需要指定respawn limit unlimited具有连续重试行为。

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

因此,我建议:

respawn
respawn limit unlimited
post-stop <script to back-off or constant delay>
Run Code Online (Sandbox Code Playgroud)