Как реализовать механизм повтора при выполнении URL-адреса сервера в сценарии оболочки?

Я работаю над проектом, в котором мне нужно сделать URL-адрес на один из моих серверов из сценария оболочки bash.

http://hostname.domain.com:8080/beat 

После удара по указанному выше URL-адресу я получаю следующий ответ, который мне нужно проанализировать и извлечь значение syncs_behind и syncs_behind

 state: READY process: 30 process_behind: 100 num_rounds: 60 hour_col: 2 day_col: 0 oldest_day_col: 0 

Теперь мне нужно ударить указанный выше URL каждые 10 секунд в течение 10 минут и извлечь из него значение process и process_behind а затем использовать его для проверки его с нижеследующими условиями –

 process > 8 process_behind = 0 

если syncs больше 8 и process_behind = 0, то я завершу свой сценарий оболочки некоторым сообщением: «Данные были проверены», в противном случае я продолжал бы пробовать 10-минутное окно. Если в этом 10-минутном окне, вышеприведенное условие не выполняется. Я закончу сценарий оболочки, так что я больше не буду повторять попытку.

Ниже приведен мой сценарий оболочки, который делает это выше, и он отлично работает в нормальном состоянии, когда сервер работает.

 #!/bin/bash COUNT=60 #number of 10 second timeouts in 10 minutes while [[ $COUNT -ge "0" ]]; do #send the request, put response in variable DATA=$(wget -O - -q -t 1 http://hostname.domain.com:8080/beat) #grep $DATA for process and process_behind PROCESS=$(echo $DATA | grep -oE 'process: [0-9]+' | awk '{print $2}') PROCESS_BEHIND=$(echo $DATA | grep -oE 'process_behind: [0-9]+' | awk '{print $2}') echo $PROCESS echo $PROCESS_BEHIND #verify conditionals if [[ $PROCESS -gt "8" && $PROCESS_BEHIND -eq "0" ]]; then exit 0; fi #decrement the counter let COUNT-=1 #wait another 10 seconds sleep 10 done 

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

Теперь, что я пытаюсь сделать, если сервер не работает, то я буду спать в течение 30 секунд, а затем повторить выполнение URL-адреса сервера снова, и если он снова не сработает, затем снова спящий на 30 секунд, а затем повторите попытку повторного запуска URL-адреса сервера , Я буду повторять выполнение URL-адреса сервера в течение n раз, допустим, n равно 10.

И после этого все еще не работает сервер, я выйду из сценария оболочки с ненулевым статусом, а сервер сообщений не работает. Но если сервер завершен, и я могу получить ответ обратно, я буду двигаться вперед, чтобы извлечь те поля, которые у меня есть в моем более позднем сценарии оболочки.

Возможно ли реализовать механизм повтора в сценарии оболочки bash? Или есть лучший способ сделать это, кроме wget?

ОБНОВЛЕНИЕ 1: –

Это то, что я получил –

 #!/bin/bash COUNT=60 #number of 10 second timeouts in 10 minutes DATA="" RETRY=10 while [[ $COUNT -ge "0" ]]; do while [ $RETRY -gt 0 ] do #send the request, put response in variable DATA=$(wget -O - -q -t 1 http://machineA:8080/beat) echo "Hello" if [ $? -eq 0 ] then break else let RETRY-=1 sleep 30 fi done if [ $RETRY -eq 0 ] then exit 2 fi #grep $DATA for process and process_behind PROCESS=$(echo $DATA | grep -oE 'process: [0-9]+' | awk '{print $2}') PROCESS_BEHIND=$(echo $DATA | grep -oE 'process_behind: [0-9]+' | awk '{print $2}') echo $PROCESS echo $PROCESS_BEHIND #verify conditionals if [[ $PROCESS -gt "8" && $PROCESS_BEHIND -eq "0" ]]; then exit 0; fi #decrement the counter let COUNT-=1 #wait another 10 seconds sleep 10 done 

Если мой сервер выключен, и я запускаю указанный выше сценарий оболочки, он печатает «Hello» на консоли, и он отлично работает. Но см. Мое ниже обновление –

Обновление 2: –

Хорошо, теперь я нашел проблему, если я запускаю сценарий оболочки, подобный этому, который я буду запускать в своей производственной системе, и если сервер не работает, то он вообще не выводит «Привет». Но если я запустил вышеуказанный сценарий оболочки в «Обновление 1», а если сервер не работает, значит, он работает нормально.

 #!/bin/bash COUNT=60 #number of 10 second timeouts in 10 minutes HOSTNAME=machineA DATA="" RETRY=10 while [[ $COUNT -ge "0" ]]; do while [ $RETRY -gt 0 ] do #send the request, put response in variable DATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/beat) echo "Hello" if [ $? -eq 0 ] then break else let RETRY-=1 sleep 30 fi done if [ $RETRY -eq 0 ] then exit 2 fi #grep $DATA for process and process_behind PROCESS=$(echo $DATA | grep -oE 'process: [0-9]+' | awk '{print $2}') PROCESS_BEHIND=$(echo $DATA | grep -oE 'process_behind: [0-9]+' | awk '{print $2}') echo $PROCESS echo $PROCESS_BEHIND #verify conditionals if [[ $PROCESS -gt "8" && $PROCESS_BEHIND -eq "0" ]]; then exit 0; fi #decrement the counter let COUNT-=1 #wait another 10 seconds sleep 10 done 

Это то, что я получаю в режиме отладки с вышеупомянутым скриптом –

 david@some-machine:~$ bash -x ./ping1.sh + set -e + COUNT=60 + HOSTNAME=machineA + DATA= + RETRY=10 + echo machineA machineA + [[ 60 -ge 0 ]] + '[' 10 -gt 0 ']' ++ wget -O - -q -t 1 http://machineA:8080/beat + DATA= 

Думаю, оба сценария одинаковы? Тогда почему это происходит?

One Solution collect form web for “Как реализовать механизм повтора при выполнении URL-адреса сервера в сценарии оболочки?”

Вы можете использовать простой цикл:

 .... DATA="" RETRY=10 while [ "$RETRY" -gt 0 ]; do DATA="$(wget -O - -q -t 1 http://hostname.domain.com:8080/beat)" if [ $? -eq 0 ] then break else let RETRY-=1 sleep 30 fi done if [ "$RETRY" -eq 0 ] then exit 2 fi .... 
  • Загрузите рекурсивно с помощью wget
  • wget зависает ПОСЛЕ завершения загрузки, на exit_group
  • wget не останавливается
  • Как получить список URL-адресов из URL рекурсивно с фильтрацией
  • Что такое флаг для загрузки скрытых файлов с помощью wget?
  • Игнорировать «другие» домены при загрузке с помощью wget?
  • Предсказывать имя файла перед загрузкой с URL-адреса, в сценарии оболочки
  • Wget: ошибка сегментации (сбрасывание ядра)
  • Продолжить загрузку, если временная метка не изменилась
  • bash scripting - wget или curl-файл с действием на основе состояния 200 или нет
  • Объединить аргумент xargs с некоторым текстом
  • Несколько вызовов wget за один сеанс?
  • Linux и Unix - лучшая ОС в мире.