
Recentemente descobri o xargs --max-procs
recurso.
Como posso dividir a saída do comando por proc? Devo apenas criar um mycommand --logfile $LOGFILE
, ou posso fazer isso a partir do próprio xargs?
Um exemplo (para womble):
Suponha que eu tenha o script myprocessor.sh e uma lista de arquivos. Eles podem ir em qualquer ordem, mas quero manter o registro de cada um separado, então:
find $MY_FILE_TREE --print0 | xargs --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh
pode ser o trabalho paralelo que desejo executar. Se myprocessor.sh
for tagarela, gostaria de poder imprimir cada invocação em um log diferente. Caso contrário, o stdout para cada um será o mesmo e os logs ficarão confusos.
Responder1
Você poderia fazer isso executando o comando xargs através de um shell - isso permitirá redirecionar a saída - algo como isto:
find blah -type f | xargs -I{} -P 4 -n 1 sh -c 'yourcommand --input {} > {}.output'
... você provavelmente terá que ajustá-lo um pouco - xargs substitui {} pelo item/arquivo em que está trabalhando
Responder2
Paralelo GNUhttp://www.gnu.org/software/parallel/parece ter sido feito para você, porque combina automaticamente a saída padrão dos processos de maneira correta.
find $MY_FILE_TREE --print0 | parallel --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh ">" {}.output
ou mais curto:
find $MY_FILE_TREE --print0 | parallel -0 -j3 -r myprocess.sh ">" {}.output
Assista ao vídeo de introdução:http://www.youtube.com/watch?v=OpaiGYxkSuQ
Responder3
Você poderia alterar seu script para que na inicialização ele escolha um número/texto aleatório e prefixe cada linha com esse número? Posteriormente, você poderá dividi-lo usando grep.