O embutimento do wait do bash fará o truque ...
script 1 > output1.txt &
script 2 > output2.txt &
script 3 > output3.txt &
script 4 > output4.txt &
wait
cat output1.txt output2.txt output3.txt output4.txt > output5.txt
sort output5.txt | uniq -u
Então no Linux, eu quero rodar um script 4 vezes, depois fazer coisas para a saída.
Eu posso fazer:
script 1 > output1.txt
script 2 > output2.txt
script 3 > output3.txt
script 4 > output4.txt
cat output1.txt output2.txt output3.txt output4.txt > output5.txt
sort output5.txt | uniq -u
Mas eu gostaria que os quatro primeiros rodassem em paralelo (mais rápido). Se eu colocá-los no fundo, então ele vai pular para a quinta linha, o que não será bem sucedido até que os quatro primeiros terminem.
EDIT: Obrigado pelas respostas. Eu tentei alguns destes, mas não tenho certeza se eles vão funcionar, porque eu preciso (a) 4 scripts diferentes para rodar em paralelo, não o mesmo quatro vezes, e (b) as saídas de cada script precisam ser salvo em um arquivo .txt (isso é muito importante). Eu atualizei o acima para refletir isso.
As pessoas no meu escritório adoram usar o xargs, então essa seria a minha preferência (embora eu esteja aberto a qualquer coisa).
Obrigado!
O embutimento do wait do bash fará o truque ...
script 1 > output1.txt &
script 2 > output2.txt &
script 3 > output3.txt &
script 4 > output4.txt &
wait
cat output1.txt output2.txt output3.txt output4.txt > output5.txt
sort output5.txt | uniq -u
Com moreutils ' parallel
:
parallel -- script-1 script-2
cat out1 out2 out3 out4
A segunda linha será executada quando todos os trabalhos de parallel
tiverem saído. Se o seu script contiver argumentos, você precisa citá-lo, por exemplo,
parallel -- 'script-1 argument1' script-2
Isso também pode ser feito com o Paralelo GNU , mas eu não o tenho no meu sistema devido à nomeação óbvia conflitos. Eu acho que você só precisa fazer uma lista de scripts e, em seguida:
cat list-of-scripts > parallel -j4
cat out1 out2 out3 out4
O -j4
significa que parallel
será executado em 4 núcleos, se possível.
Eu recomendo usar o GNU parallel
. Existe um tutorial conveniente para aqui . Ele pode permitir que você execute todos os quatro scripts em paralelo e, em seguida, execute o quinto comando, ou pode configurá-lo para canalizar os quatro primeiros para o quarto, executando todos os cinco em paralelo. Aqui está o comando para executar todos os quatro em paralelo:
parallel ::: script-1 script-2 script-3 script-4
Você pode canalizar a saída diretamente para o quinto comando. Por padrão, parallel
agrupará a saída de cada comando, por exemplo, Se script-2 for concluído primeiro, o fluxo de saída começará com a totalidade da saída do script-2, seguida pela do próximo comando a ser concluído. Use --line-buffer
se você não se importa com as linhas de saída dos diferentes comandos de mixagem. Use --keep-order
se você precisar que a saída dos comandos seja mantida em ordem, ou seja, a saída do script-1, depois do script-2, etc.
Outra opção é apenas usar xargs
, que já deve estar instalado no seu sistema. xargs
tem uma opção -P
que permite especificar o número de processos simultâneos. Observe que ele não manipula o agrupamento da saída, portanto, você não pode canalizar diretamente para o quinto comando. Normalmente você precisa definir -n
também.