Atualmente tenho o script atual.
#!/bin/bash
# script.sh
for i in {0..99}; do
script-to-run.sh input/ output/ $i
done
Desejo executá-lo em paralelo usando xargs. eu tentei
script.sh | xargs -P8
Mas fazer o que precede só é executado uma vez de cada vez. Sem sorte com -n8 também. Adicionar & no final da linha a ser executada no script para loop tentaria executar o script 99 vezes de uma vez. Como faço para executar o loop apenas 8 de cada vez, até 100 no total.
bash
parallel-processing
xargs
Olivier
fonte
fonte
Respostas:
Na
xargs
página de manual:O que significa que, para o seu exemplo,
xargs
está esperando e coletando toda a saída do seu script e depois executandoecho <that output>
. Não é exatamente tão útil nem o que você queria.O
-n
argumento é quantos itens da entrada usar com cada comando executado (nada, por si só, sobre paralelismo aqui).Para fazer o que quiser,
xargs
você precisa fazer algo mais parecido com isto (não testado):printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/
Que quebra assim.
printf %s\\n {0..99}
- Imprima um número por linha de0
a99
.xargs
fonte
echo {0..99} |
funcionaria tão bem.<<<{0..99}
não parece funcionar; embora<<<word
seja documentado como uma palavra expansível de chave, isso não acontece com nenhuma versão do bash que tenho em mãos.<<
, mas faz por<<<
assim*shrug*
). As expansões que acontecem e não acontecem aqui docs e aqui strings são um pouco estranhas para mim.time head -12 <(yes "1") | xargs -n1 -P4 sleep
executará 12sleep 1
comandos, 4 paralelos. O comando demorará 3 segundos.Com o GNU Parallel você faria:
Adicione
-P8
se você não quiser executar um trabalho por núcleo da CPU.O oposto
xargs
fará a coisa certa, mesmo se a entrada contiver espaço, ', ou "(não é o caso aqui, embora). Ele também garante que a saída de diferentes trabalhos não sejam misturados, então se você usar a saída, garantindo que você não obterá meia linha de dois trabalhos diferentesGNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas às quais você tem acesso ssh.
Se você tiver 32 tarefas diferentes que deseja executar em 4 CPUs, uma maneira direta de paralelizar é executar 8 tarefas em cada CPU:
Em vez disso, o GNU Parallel gera um novo processo quando um termina - mantendo as CPUs ativas e, portanto, economizando tempo:
Instalação
Se GNU Parallel não estiver empacotado para sua distribuição, você pode fazer uma instalação pessoal, que não requer acesso root. Isso pode ser feito em 10 segundos fazendo o seguinte:
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \ fetch -o - http://pi.dk/3 ) > install.sh $ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb 12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb $ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f b7a15cdb b07fb6e1 1b033857 7bc1780f $ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444 6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d 21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f $ bash install.sh
Para outras opções de instalação, consulte http://git.savannah.gnu.org/cgit/parallel.git/tree/README
Saber mais
Veja mais exemplos: http://www.gnu.org/software/parallel/man.html
Assista aos vídeos de introdução: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Percorra o tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html
Inscreva-se na lista de e-mail para obter suporte: https://lists.gnu.org/mailman/listinfo/parallel
fonte