xargs --max-proc divide a saída por proc?

xargs --max-proc divide a saída por proc?

Recentemente descobri o xargs --max-procsrecurso.

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.shfor 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.

informação relacionada