Dois comandos simultâneos e depois comandos sequenciais?

1

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!

    
por Alex 29.10.2013 / 22:42

3 respostas

3

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 
    
por 30.10.2013 / 00:17
2

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.

    
por 29.10.2013 / 23:22
0

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.

    
por 29.10.2013 / 23:36