Як створити цикл у bash, який чекає відповіді веб-сервера?


104

Як створити цикл у bash, який чекає відповіді веб-сервера?

Він повинен надрукувати "." кожні 10 секунд або близько того, і почекайте, поки сервер почне реагувати.

Оновлення, цей код перевіряє, чи отримаю я хорошу відповідь від сервера.

якщо curl --output / dev / null --silent --head --fail "$ url"; тоді
  echo "URL-адреса існує: $ url"
ще
  echo "URL-адреса не існує: $ url"
фі

Чи можете ви конкретніше сказати, як ви чекаєте відповіді сервера?
чепнер

Я вважатиму, що сервер не готовий, поки він не відповідає або відповідає чимось іншим, ніж відповідь 200.
сорін

Відповіді:


170

Поєднуючи запитання з відповіддю Чепнера, це спрацювало для мене:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    printf '.'
    sleep 5
done

10
Використання зворотних посилань `` застаріло . Використовуйте $( )замість цього.
Serge Stroobandt

6
Це було б чудовим продовженням, щоб дозволити максимальний час очікування перед
здачею

Навіщо вам --head?
lexicore

3
@lexicore Оскільки тіло нецікаве для цієї команди, ми вимагаємо лише голову (хоча ви можете включити логіку, щоб перевірити більше інформації про стан сервера). Залишення --headцього місця нічого не змінить, але ви можете, якщо хочете застосувати певну логіку щодо вмісту відповіді (наприклад, status.html).
Томас Ферріс Ніколайзен

1
У мене був конкретний випадок, коли використання --headзавжди поверталося 405. Довелося його видалити, щоб це спрацювало
Рон Харлев

38

Я хотів обмежити максимальну кількість спроб. На основі прийнятої відповіді Томаса я зробив так:

attempt_counter=0
max_attempts=5

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    if [ ${attempt_counter} -eq ${max_attempts} ];then
      echo "Max attempts reached"
      exit 1
    fi

    printf '.'
    attempt_counter=$(($attempt_counter+1))
    sleep 5
done

Пропоную додати, --max-time 5якщо з якихось причин запитується посилання, час
очікування

16

httping це приємно. просто, чисто, тихо.

while ! httping -qc1 http://myhost:myport ; do sleep 1 ; done

while / while і т.д. є особистим преф.


2
Якщо замислитись, назавжди - це довгий час ... for i in сек. 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
Брюс Едж


0

Цікава головоломка. Якщо у вас немає доступу або асинхронного API для вашого клієнта, ви можете спробувати захопити ваші сокети tcp таким чином:

until grep '***IPV4 ADDRESS OF SERVER IN REVERSE HEX***' /proc/net/tcp
do
  printf '.'
  sleep 1
done

Але це жваве очікування з інтервалами в 1 сек. Можливо, вам потрібна більша роздільна здатність. Також це глобально. Якщо з цим сервером встановлено інше з’єднання, результати недійсні.


-1

якщо вам потрібно перевірити, чи доступний сервер, причина перезапуску чи щось інше, ви можете спробувати створити вігет на сервері та проаналізувати відповідь або помилку, якщо ви отримаєте 200 чи навіть 404, що сервер працює, ви може змінити час очікування wget на --timeout = секунди, Ви можете встановити час очікування 10 секунд і зробити цикл, поки grep над відповіддю не отримає результат.

я не знаю, якщо це те, що ви шукаєте, чи дійсно вам потрібен код bash.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.