Принятие Вас присвоило 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
Быстрое и грязное объяснение состоит в том, что одна линия связи с использованием 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
Вы хотите лимит респауна <раз> <период>
- хотя это не обеспечит ожидаемого экспоненциального поведения, вероятно, для большинства случаев использования. Вы можете попробовать использовать очень большие значения для раз
и периода
, чтобы приблизиться к тому, чего вы пытаетесь достичь. Для справки см. Раздел man 5 init о ограничении респауна
.
В итоге я поставил start
в cronjob. Если служба запущена, это не действует. Если он не запущен, запускает службу.
Как уже упоминалось, используйте респаун
, чтобы вызвать возрождение.
Однако в описании Поваренной книги Upstart на respawn-limit
говорится, что вам нужно указать respawn limit unlimited
, чтобы иметь постоянное поведение повтора.
По умолчанию он будет повторять попытку до тех пор, пока процесс не возрождается более 10 раз за 5 секунд.
Поэтому я бы предложил:
respawn
respawn limit unlimited
post-stop <script to back-off or constant delay>
Другие ответили на вопрос о строфах ограничения возрождения и возрождения, но я хотел бы добавить свое собственное решение для сценария пост-остановки, который контролирует задержку между перезапусками.
Самая большая проблема с решением, предложенным Роджером Дуеком, заключается в том, что задержка приводит к зависанию '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
Я сделал улучшение в ответе 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