Answers:
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
post-start
其重置为1。
如前所述,用于respawn
触发重生。
但是,关于Upstart Cookbook的报道respawn-limit
说,您需要指定respawn limit unlimited
具有连续的重试行为。
默认情况下,只要该过程在5秒钟内没有重生10次以上,它就会重试。
因此,我建议:
respawn
respawn limit unlimited
post-stop <script to back-off or constant delay>
我对罗杰的回答做了改进。通常,当基础软件出现问题导致它在短时间内大量崩溃时,您通常想要退避,但是一旦系统恢复后,您想重置退避时间。在Roger的版本中,该服务将始终休眠60秒,即使在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提出的解决方案的最大问题是延迟导致“重新启动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
仍然没有答案。任何人?