Como eu usaria o GNU Parallel para este 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 este loop while?

    
por Proletariat 11.09.2015 / 13:50

3 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 ), pois ele se expandirá para sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file (resultando em no such file or directory ); para esses casos, use {//} e {/} (consulte gnu-parallel manual para obter detalhes):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
    
por 11.09.2015 / 14:51
3

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

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

Se você chamar wrapper.sh , o comando parallel para chamá-lo será:

parallel wrapper.sh < live_hosts

Observe que você não precisa de cat para esse tipo de coisa, o que salva uma chamada de programa externa.

    
por 11.09.2015 / 14:27
2

Você não precisa parallel , já que 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

parallel facilita o gerenciamento de certos aspectos; você pode limitar o número de trabalhos em execução em paralelo com mais facilidade.

    
por 11.09.2015 / 19:47