Eu tenho o seguinte script bash ( neste post ):
#!/bin/bash
while read LINE; do
curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done < infile > outfile
no arquivo:
google.com
facebook.com
arquivo de saída:
301 amazon.com
302 facebook.com
Problema: É muito lento, pois verifica linha por linha.
Testes: Já tentei outras alternativas, como fping (muito limitado devido ao tamanho da lista), pyfunceble (congela), wget , GNU parallel , etc, etc. Nenhuma me convenceu. E aqui está uma solução com xargs, mas a saída é diferente do script original
Descrição : Como posso iniciar várias consultas (processamento paralelo) com este script para poder processar muitas linhas ao mesmo tempo (se seria possível definir o número de linhas a serem processadas manualmente, evitando congelar ou bloquear o script ou computador)?
Atualização: Resolvido!. Obrigado
cat infile | xargs -I {} -P3 curl {} -o /dev/null --silent --head --write-out "%{http_code} {}\n" > outfile
PD: "-P 3" número de instâncias
Devido a https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P (saída de trabalhos paralelos em
xargs
riscos de serem misturados), eu usaria o GNU Parallel:Nesse caso específico, pode ser seguro usar
xargs
porque a saída é muito curta, então o problema com o usoxargs
é que, se alguém mais tarde alterar o código para fazer algo maior, não será mais seguro. Ou se alguém ler esta pergunta e achar que pode substituircurl
por outra coisa, isso também pode não ser seguro.Isso pode ser mais rápido:
você pode dividir sua lista de URLs em, por exemplo, 10 partes e usar um script principal ala
para executá-lo em paralelo. Cuidado: Eles devem usar arquivos de log distintos.