Como criar um loop no bash que está esperando a resposta de um servidor web?

104

Como criar um loop no bash que está esperando a resposta de um servidor web?

Deve imprimir um "." a cada 10 segundos ou mais e aguarde até que o servidor comece a responder.

Update, este código testa se obtenho uma boa resposta do servidor.

if curl --output / dev / null --silent --head --fail "$ url"; então
  echo "URL existe: $ url"
outro
  echo "URL não existe: $ url"
fi
Sorin
fonte
Você pode ser mais específico sobre como está esperando a resposta do servidor?
chepner de
Vou considerar que o servidor não está pronto, desde que não responda ou responda com algo diferente de uma resposta 200.
Sorin

Respostas:

170

Combinando a pergunta com a resposta do chepner, funcionou para mim:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    printf '.'
    sleep 5
done
Thomas Ferris Nicolaisen
fonte
10
O uso de crases `` está desatualizado . Use em seu $( )lugar.
Serge Stroobandt de
6
Seria uma grande extensão para permitir um tempo máximo de espera antes de desistir
tkruse
Por que você precisa de um --head?
Lexicore
3
@lexicore Uma vez que o corpo não é interessante para este comando, solicitamos apenas o cabeçote (embora você possa incluir lógica para verificar mais informações sobre o estado do servidor). Deixar de fora --headnão mudaria nada, mas você poderia se quiser exercitar alguma lógica no conteúdo da resposta (como um status.html).
Thomas Ferris Nicolaisen
1
Tive um caso específico em que usar --headsempre voltou 405. Tive que removê-lo para que funcionasse
Ron Harlev
38

Eu queria limitar o número máximo de tentativas. Com base na resposta aceita de Thomas, fiz o seguinte:

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
Illagrenan
fonte
Sugiro adicionar --max-time 5se por algum motivo o link solicitado expirar
Enigo
16

Httping é bom para isso. simples, limpo, silencioso.

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

enquanto / até etc é uma preferência pessoal.

Bruce Edge
fonte
2
Pensando bem, para sempre é muito tempo ... for i in seq 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
Bruce Edge
2

O uso de backticks ` `está desatualizado . Use em seu $( )lugar:

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

Quebra-cabeça interessante. Se você não tem acesso ou api assíncrono com seu cliente, você pode tentar executar grep em seus sockets tcp desta forma:

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

Mas essa é uma espera ocupada com intervalos de 1 segundo. Você provavelmente quer mais resolução do que isso. Também isso é global. Se outra conexão for feita com esse servidor, seus resultados serão inválidos.

BoeroBoy
fonte
-1

se precisar verificar se o servidor está disponível, a causa está reiniciando ou outra coisa, você pode tentar fazer um wget para o servidor e analisar a resposta ou o erro, se você obtiver 200 ou mesmo 404 o servidor está ativo, você poderia alterar o tempo limite do wget com --timeout = segundos, Você poderia definir o tempo limite para 10 segundos e fazer um loop até que o grep sobre a resposta tivesse um resultado.

Não sei se é isso que você está procurando ou se realmente precisa do código bash.

Coágulo
fonte