Como eu usaria o GNU Parallel para esse loop while?

12

Então, eu tenho um loop while:

cat live_hosts | while read host; do \
    sortstuff.sh -a "$host" > sortedstuff-"$host"; done

Mas isso pode levar muito tempo. Como eu usaria o GNU Parallel para esse loop while?

Proletariado
fonte

Respostas:

13

Você não usa um loop while.

parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts

Observe que isso não funcionará se você tiver caminhos no seu live_hosts(por exemplo /some/dir/file), como seria expandido para sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(resultando em no such file or directory); nesses casos, use {//}e {/}(consulte o gnu-parallelmanual para obter detalhes):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
don_crissti
fonte
É possível utilizar teecom parallelao colocar a saída em sortedstuff? Para que eu possa ver a saída como ela é.
Proletariado
1
@ Proletariado - você também quer enviar para o terminal? Basta substituir >com | teepor exemplo, o primeiro comando torna-se parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti
3

Como um cara do Unix da velha escola "faça uma coisa e faça bem", eu colocaria o material de substituição de string em um script de wrapper:

#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"

Se você chamá-lo wrapper.sh, o parallelcomando para chamá-lo seria:

parallel wrapper.sh < live_hosts

Observe que você não precisa catdesse tipo de coisa, o que salva uma invocação de programa externo.

Warren Young
fonte
2

Você não precisa parallel , pois o corpo do loop não depende de iterações anteriores. Basta iniciar um novo processo em segundo plano para cada host.

while read host; do
    sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait    # Optional, to block until the background tasks are done

paralleltorna mais fácil gerenciar certos aspectos; você pode limitar o número de trabalhos em execução em paralelo com mais facilidade.

chepner
fonte
3
Se wc -l live_hostsfor mais do que o número de eixos de disco ou núcleos de CPU - dependendo se a tarefa é de E / S ou ligada à CPU -, você terá muitas vantagens do paralelismo com uma solução como essa. A capacidade de parallellimitar o número de trabalhos não é apenas agradável, é quase essencial, se a velocidade do processamento for o seu objetivo.
Warren Young