Uma maneira mais rápida de fazer ping de URL do que curl [closed]

5

Qual seria a maneira mais rápida de verificar se o URL especificado está funcionando? (respondendo no código de status http OK)?

Por enquanto, estou usando o curl, mas tenho muitas URLs para testar em um loop, então estou procurando a solução mais rápida.

Alguma opção para checar além do wget?

    
por Sfisioza 16.04.2015 / 10:49

2 respostas

8

Suspeito que qualquer aumento de desempenho que você verá será o de melhorar o wrapper que estiver usando para fazer suas conexões, em vez da sobrecarga de lançamento de curl para cada URL. Seja curl ou netcat ou wget , você provavelmente desejará iniciar cada um separadamente para processar seus resultados separadamente.

Mas responderei a essa pergunta de duas maneiras, apenas por diversão.

Primeiro, você pode realmente fazer conexões TCP no bash sem ter que iniciar algo como curl / wget / netcat / fetch / etc. Por exemplo:

#!/usr/bin/env bash

hostlist=(
  www.xe.com
  www.google.com
)

for host in "${hostlist[@]}"; do
  exec 3<>/dev/tcp/$host/80         # open a socket connection on fd/3
  printf "HEAD / HTTP/1.0\n\n" >&3  # send a request
  read -u 3 protocol code message   # read the result (first line only)
  exec 3<&-; exec 3>&-              # close fd/3, in and out
  echo ">> $host -- $code $message ($protocol)"
  printf ">> %s -- %s %s (%s)\n" "$host" "$code" "${message%?}" "$protocol"
done

Encontrei uma boa documentação sobre esse recurso aqui .

Observe o tratamento de $message . Como este é o protocolo HTTP, a linha tem um \r no final. Isso tira isso, para uma exibição mais sensata.

Note que procurar por "OK" provavelmente não é o que você deseja fazer. No meu exemplo acima, www.google.com retorna um redirecionamento 302 em vez de um 200 OK, o que é uma resposta perfeitamente válida.

Note também que tentar abrir uma conexão dessa maneira em um host inexistente é um erro. Você vai querer pensar sobre as várias condições de erro que você pode encontrar neste script e como você quer lidar com elas.

A segunda opção é usar uma ferramenta que permita que vários URLs sejam fornecidos em uma linha de comando. Por acaso, curl faz isso. E você pode massagear sua saída de maneiras belas e maravilhosas. Por exemplo:

curl -sL -w "%{http_code} %{url_effective}\n" \ 
 "http://www.xe.com/" -o /dev/null \
 "http://www.google.com" -o /dev/null

Note que esta solução realiza um HTTP GET ao invés de um HEAD, então você está transferindo mais dados, mas obtendo um resultado mais "puro". Se você deseja economizar largura de banda usando HEAD, use a opção -I do curl. (Descobri que, em algumas situações, especialmente com Java ™, o método HEAD periodicamente não é implementado. O uso de GET pode aumentar a probabilidade de que a resposta seja equivalente à fornecida a um navegador, embora com o custo de largura de banda extra .)

Você pode fazer o script da expansão da sua lista de URLs em uma linha de comando da maneira que quiser. Embora, claro, se você está lidando com milhares e milhares de URLs, você pode querer envolvê-los na primeira solução, afinal.

    
por 16.04.2015 / 13:48
1

Talvez use o Netcat?

( netcat $domain 80 | head -n 1 ) << EOF
HEAD / HTTP/1.0
Host: $domain


EOF

Saída:

HTTP/1.1 200 OK
    
por 16.04.2015 / 12:17