포기하지 않고 다시 시작하는 법 초 후에 죽은 프로세스를 다시 시작한

Upstart가 두 가지 일을하기를 원합니다.

  1. 실패한 프로세스를 너무 빨리 재생성하지 마십시오.
  2. 리스폰 시도를 포기하지 마십시오

이상적인 세계에서 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-limitrespawn limit unlimited 은 계속 재시도 동작을 하도록 지정해야한다고 말합니다 .

기본적으로 프로세스가 5 초 동안 10 번 이상 다시 생성되지 않는 한 재 시도됩니다.

그러므로 나는 제안 할 것이다 :

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

답변

나는 startcronjob에 넣어 결국 . 서비스가 실행 중이면 아무런 영향을 미치지 않습니다. 실행 중이 아니면 서비스를 시작합니다.


답변

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