Múltipla leitura de um arquivo txt no bash (processamento paralelo)

3

Aqui está um script simples para o código de status HTTP

while read url
    do
        urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 )
        echo "$url  $urlstatus" >> urlstatus.txt
    done < $1

Estou lendo o URL do arquivo de texto, mas ele processa apenas um de cada vez, demorando muito tempo, o GNU paralelo e o xargs também processam uma linha no tempo (testado)

Como processar um URL simultâneo para processamento para melhorar o tempo? Em outras palavras, encadeamento de arquivos URL ao invés de comandos bash (o que o GNU paralelo e o xargs fazem)

como resposta do usuário este código funciona bem, exceto que não processa uma última URL

urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 ) && echo "$url  $urlstatus" >> urlstatus.txt &

pode estar adicionando ajuda de espera , sugestões

    
por user7423959 18.01.2017 / 13:13

2 respostas

3

No bash, você pode usar o & símbolo para executar programas em segundo plano. Exemplo

for i in {1..100..1}; do
  echo $i>>numbers.txt &
done;

EDITAR: Desculpe, mas a resposta para sua pergunta no comentário está errada, então eu editei a resposta. Sugestões código wrt

urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 ) && echo "$url  $urlstatus" >> urlstatus.txt &
    
por 18.01.2017 / 14:28
1

GNU parallel and xargs also process one line at time (tested)

Você pode dar um exemplo disso? Se você usar -j , poderá executar muito mais de um processo por vez.

Eu escreveria assim:

doit() {
    url="$1"
    urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 )
    echo "$url  $urlstatus"
}
export -f doit
cat input.txt | parallel -j0 -k doit

Com base no arquivo input.txt:

Input file is txt file and lines are separated  as
ABC.Com
Bcd.Com
Any.Google.Com
Something  like this
www.google.com
pi.dk

Eu recebo a saída:

Input file is txt file and lines are separated  as  000
ABC.Com  301
Bcd.Com  301
Any.Google.Com  000
Something  like this  000
www.google.com  302
pi.dk  200

O que parece certo:

000 if domain does not exist
301/302 for redirection
200 for success

Devo dizer que estou um pouco surpreso se as linhas de entrada que você forneceu realmente são partes da entrada que você realmente usa. Nenhum desses domínios existe e nomes de domínio com espaços provavelmente nunca existirão:

Input file is txt file and lines are separated  as
Any.Google.Com
Something  like this

Se você não deu entrada do seu arquivo de entrada, você deveria fazer isso em vez de inventar coisas - especialmente se o material inventado não se assemelhar aos dados reais.

Editar

Depurando por que isso não funciona para você.

Por favor, não escreva um script, mas execute isso diretamente no terminal:

bash # press enter here to make sure you are running this in bash
doit() {
    url="$1"
    urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 )
    echo "$url  $urlstatus"
}
export -f doit
echo pi.dk | parallel -j0 -k doit

Isso deve dar:

pi.dk  200
    
por 19.01.2017 / 00:23