Upstart가 두 가지 일을하기를 원합니다.
- 실패한 프로세스를 너무 빨리 재생성하지 마십시오.
- 리스폰 시도를 포기하지 마십시오
이상적인 세계에서 upstart는 1 초 후에 죽은 프로세스를 다시 시작한 다음 한 시간에 도달 할 때까지 각 시도에서 해당 지연을 두 배로 늘리려 고합니다.
이와 같은 것이 가능합니까?
답변
Upstart Cookbook은 정지 후 지연을 권장합니다 ( http://upstart.ubuntu.com/cookbook/#delay-respawn-of-a-job ). respawn
인수없이 스탠자를 사용하면 계속 시도 할 수 있습니다.
respawn
post-stop exec sleep 5
( 이 Ask Ubuntu 질문 에서 이것을 얻었습니다 )
지수 지연 부분을 추가하기 위해 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
** 편집하다 **
실제 정지시 지연을 피하면서 다시 생성 할 때만 지연을 적용하려면 현재 목표가 “중지”인지 여부를 확인하는 다음을 사용하십시오.
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
답변
이미 언급했듯이 respawn
리스폰을 트리거하는 데 사용 하십시오.
그러나 Upstart Cookbookrespawn-limit
respawn limit unlimited
은 계속 재시도 동작을 하도록 지정해야한다고 말합니다 .
기본적으로 프로세스가 5 초 동안 10 번 이상 다시 생성되지 않는 한 재 시도됩니다.
그러므로 나는 제안 할 것이다 :
respawn
respawn limit unlimited
post-stop <script to back-off or constant delay>
답변
나는 start
cronjob에 넣어 결국 . 서비스가 실행 중이면 아무런 영향을 미치지 않습니다. 실행 중이 아니면 서비스를 시작합니다.
답변
Roger의 답변을 개선했습니다. 기본 소프트웨어에 문제가 발생하여 짧은 시간 내에 많은 충돌이 발생하는 경우 일반적으로 백 오프를 원하지만 시스템이 복구되면 백 오프 시간을 재설정하려고합니다. Roger의 버전에서는 7 번의 충돌 후 단일 및 격리 된 충돌이 발생하더라도 서비스는 항상 60 초 동안 절전 모드로 전환됩니다.
#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
당신이 달성하려고 무엇에 근접 할 수 있습니다. 참고 항목 사람 5 초기화 에의 섹션을 respawn limit
참조하십시오.
답변
다른 사람들은 respawn 및 respawn limit 스탠자에 대한 질문에 대답했지만 재시작 사이의 지연을 제어하는 post-stop 스크립트에 대한 자체 솔루션을 추가하고 싶습니다.
Roger Dueck이 제안한 솔루션의 가장 큰 문제점은 지연으로 인해 절전 모드가 완료 될 때까지 ‘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