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.