Как заставить выскочку отступить, вместо того, чтобы сдаться

Принятие Вас присвоило IP BMC, Вы можете telnet в и выполнять этот инструмент из IBM. Это имеет опции сброса и сила. Помеха, я не знаю, включают ли те команды фактический BMC - трагичный. Но это может дать Вам начальную точку.

http://idolinux.blogspot.com/2008/11/ibm-baseboard-management-controller.html

http://www-947.ibm.com/support/entry/portal/docdisplay?brand=5000008&lndocid=MIGR-64636

24
задан 28 January 2013 в 11:18
6 ответов

Быстрое и грязное объяснение состоит в том, что одна линия связи с использованием LACP не будет разделять пакеты на несколько интерфейсов. Например, если у вас есть одно соединение TCP с потоковой передачей пакетов от HostA к HostB, оно не будет охватывать интерфейсы для отправки этих пакетов. В последнее время я много смотрел на LACP в поисках решения, над которым мы работаем, и это распространенное заблуждение, что «связывание» или «транкинг» нескольких сетевых интерфейсов с LACP дает вам "

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

** EDIT **

Чтобы применить задержку только при возрождении, избегая задержки при реальной остановке, используйте следующее, которое проверяет, является ли текущая цель «стоп» или нет:

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
29
ответ дан 28 November 2019 в 20:17

Вы хотите лимит респауна <раз> <период> - хотя это не обеспечит ожидаемого экспоненциального поведения, вероятно, для большинства случаев использования. Вы можете попробовать использовать очень большие значения для раз и периода , чтобы приблизиться к тому, чего вы пытаетесь достичь. Для справки см. Раздел man 5 init о ограничении респауна .

1
ответ дан 28 November 2019 в 20:17

В итоге я поставил start в cronjob. Если служба запущена, это не действует. Если он не запущен, запускает службу.

4
ответ дан 28 November 2019 в 20:17

Как уже упоминалось, используйте респаун , чтобы вызвать возрождение.

Однако в описании Поваренной книги Upstart на respawn-limit говорится, что вам нужно указать respawn limit unlimited , чтобы иметь постоянное поведение повтора.

По умолчанию он будет повторять попытку до тех пор, пока процесс не возрождается более 10 раз за 5 секунд.

Поэтому я бы предложил:

respawn
respawn limit unlimited
post-stop <script to back-off or constant delay>
5
ответ дан 28 November 2019 в 20:17

Другие ответили на вопрос о строфах ограничения возрождения и возрождения, но я хотел бы добавить свое собственное решение для сценария пост-остановки, который контролирует задержку между перезапусками.

Самая большая проблема с решением, предложенным Роджером Дуеком, заключается в том, что задержка приводит к зависанию '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
0
ответ дан 28 November 2019 в 20:17

Я сделал улучшение в ответе 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
3
ответ дан 28 November 2019 в 20:17

Теги

Похожие вопросы