Bash script multithreading em comandos curl

3

aqui está um script de shell que leva o domínio e seus parâmetros para encontrar o código de status. isso corre muito mais rápido devido ao encadeamento, mas perde muitos pedidos.

while IFS= read -r url <&3; do
    while IFS= read -r uri <&4; do
    urlstatus=$(curl -o /dev/null --insecure --silent --head --write-out  '%{http_code}' "${url}""${uri}" --max-time 5 ) &&
    echo "$url  $urlstatus $uri" >> urlstatus.txt &
done 4<uri.txt 
done 3<url.txt

se eu corri normalmente, processa todos os pedidos, mas a velocidade é muito baixa. Existe um caminho através do qual a velocidade é mantida e também não perde todos os pedidos.

    
por user7423959 05.04.2017 / 13:52

2 respostas

5

Você está tendo o problema de anexar um arquivo em paralelo. A resposta fácil é: não.

Aqui está como você pode fazer isso usando o GNU Parallel:

doit() {
    url="$1"
    uri="$2"
    urlstatus=$(curl -o /dev/null --insecure --silent --head --write-out  '%{http_code}' "${url}""${uri}" --max-time 5 ) &&
    echo "$url  $urlstatus $uri"
}
export -f doit

parallel -j200 doit :::: url uri >> urlstatus.txt

O GNU Parallel usa como padrão a serialização da saída, portanto, você não obterá a saída de um trabalho misturado com a saída de outro.

    
por 06.04.2017 / 00:45
1

Embora você possa executar vários processos de forma assíncrona (utilizando a sintaxe " shellcmd & ") no shell, o subprocesso pode (e geralmente termina) antes que o próximo comando possa capturar sua saída . E, como apontou @ Ole-Tange, não há como garantir a gravação dessa saída em um arquivo na ordem correta!

Muitos querem usar uma linguagem de script diferente, na qual você pode gerenciar vários encadeamentos versus usar um script de shell ...

    
por 06.04.2017 / 18:52