O Cookbook Upstart recomenda um atraso pós-parada ( link ). Use a sub-rotina respawn
sem argumentos e ela continuará tentando para sempre:
respawn
post-stop exec sleep 5
(Eu tenho isso de esta questão do Ask Ask do Ubuntu
Para adicionar a parte de atraso exponencial, tentei trabalhar com uma variável de ambiente no script de pós-parada, acho que algo como:
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
** EDITAR **
Para aplicar o atraso apenas ao respawning, evitando o atraso em uma parada real, use o seguinte, que verifica se a meta atual é "stop" ou não:
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