Я хочу написать логику в сценарии оболочки, которая будет повторять его запуск через 15 секунд до 5 раз, основываясь на «status code = FAIL», если произойдет сбой из-за какой-либо проблемы.
shell-script
Сандип Сингх
источник
источник
break
если команда добьется успеха, то она разорвет петлюif command; then break; fi
или более кратко простоcommand && break
n
сбоев он без необходимости спит еще один раз перед выходом.Замените «команда» вашей командой. Это предполагает, что «код состояния = ОТКАЗ» означает любой ненулевой код возврата.
Варианты:
Используя
{..}
синтаксис. Работает в большинстве оболочек, но не в BusyBoxsh
:Используя
seq
и передавая код завершения неудачной команды:То же, что и выше, но пропускаем
sleep 15
после окончательного сбоя. Поскольку лучше определить максимальное количество циклов только один раз, это достигается путем перехода в спящий режим в начале цикла, еслиi > 1
:источник
for i in 1 2 3 4 5
с ,for i in {1..5}
потому что это легче поддерживать.&&
вычисляется раньше||
из-за приоритета оператораcommand
сбой.[[ i -eq 5]]
состояние ИЛИ перед сном, чтобы избежать этого.Пример:
производит этот вывод:
Для реального рабочего примера со сложными командами см. Этот скрипт .
источник
Вот функция для повтора
Выход :
источник
bash retry.sh 3 ping -c1 localhost
GNU Parallel имеет
--retries
:источник
Вот мой любимый однострочный псевдоним / скрипт
Тогда вы можете делать такие вещи, как:
и он продолжит выполнение предыдущей команды, пока не найдет «Следующий процесс»
источник
fc -e "#"
вместоfc -s
.Я использую этот сценарий, который выполняет повторные попытки данной команды, преимущество этого сценария в том, что в случае неудачи при всех повторных попытках он сохранит код завершения.
Возможно, это может стать проще
источник
Смотрите ниже Пример:
Я пытаюсь подключить порт 3389 на localhost, он будет повторяться до тех пор, пока не произойдет сбой 5 раз, в случае успеха он прервет цикл.
$?
это существующий статус команды, если ноль означает, что команда успешно запущена, если кроме нуля означает команду faiКажется, немного сложнее, может быть, кто-то делает это лучше, чем это.
источник
$?
это существующий статус команды, если она равна нулю, означает, что команда успешно запущена, если кроме нуля означает, что команда не выполненаВы можете использовать
loop
команду, доступную здесь , вот так:Который будет делать ваше дело каждые 15 секунд, пока не добьется успеха, максимум пять раз.
источник
Вот рекурсивная
retry
функция для пуристов функционального программирования:Передайте ему команду (или имя функции) и, необязательно, количество повторных попыток и продолжительность ожидания между повторными попытками, например так:
источник