Как создать цикл в bash, который ожидает ответа веб-сервера?

105

Как создать цикл в bash, который ожидает ответа веб-сервера?

Он должен напечатать "." каждые 10 секунд или около того и ждите, пока сервер не начнет отвечать.

Обновите, этот код проверяет, получаю ли я хороший ответ от сервера.

если curl --output / dev / null --silent --head --fail "$ url"; затем
  echo "URL существует: $ url"
еще
  echo "URL не существует: $ url"
фи
Сорин
источник
Не могли бы вы более конкретно рассказать, как вы ждете ответа сервера?
chepner
Я буду считать, что сервер не готов, пока он не отвечает или отвечает чем-то, отличным от ответа 200.
sorin 06

Ответы:

173

Объединив вопрос с ответом Чепнера, это сработало для меня:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    printf '.'
    sleep 5
done
Томас Феррис Николайсен
источник
10
Использование обратных кавычек '' устарело . $( )Вместо этого используйте .
Серж Строобандт
6
Было бы отличным продлением, чтобы позволить максимальное время ожидания перед тем, как сдаться,
tkruse
Зачем тебе нужен --head?
lexicore 03
3
@lexicore Поскольку тело этой команды не представляет интереса, мы запрашиваем только заголовок (хотя вы могли бы включить логику для проверки дополнительных сведений о состоянии сервера). Отключение --headничего не изменит, но вы можете, если хотите поработать логику с содержимым ответа (например, status.html).
Thomas Ferris Nicolaisen
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если по каким-либо причинам время ожидания ссылки истекло
Enigo
16

httping подходит для этого. просто, чисто, тихо.

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

while / until etc - личная прив.

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

Использование обратных кавычек ` `является устаревшим . $( )Вместо этого используйте :

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
  printf '.'
  sleep 5
done
Серж Строобандт
источник
0

Интересная головоломка. Если у вас нет доступа или асинхронного API с вашим клиентом, вы можете попробовать использовать grep для своих сокетов tcp следующим образом:

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

Но это занятое ожидание с интервалом в 1 секунду. Вы, вероятно, хотите большего разрешения, чем это. Также это глобально. Если к этому серверу установлено другое соединение, ваши результаты недействительны.

BoeroBoy
источник
-1

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

я не знаю, это то, что вы ищете, или вам действительно нужен код bash.

Сгусток
источник