Acompanhando o progresso com xargs

11

Estou usando o xargs para executar um comando em um conjunto de parâmetros de entrada, algo como isto:

cat <someinput> | xargs -n 1 -P 5 <somecmd>

O arquivo de entrada é muito longo e leva muito tempo para ser executado. Então, eu estou apenas esperando o prompt de comando aparecer. Existe uma maneira de exibir uma barra de progresso para o número de argumentos de entrada que foram concluídos?

Tentei usar 'bar', mas sempre obtive um rendimento 'infinito'. Parece que o xargs lê toda a entrada antes de executar os comandos.

http://i.stack.imgur.com/5Wsgx.gif

Utkarsh Sinha
fonte

Respostas:

13

Se você possui o GNU Parallel, você pode executar:

cat <someinput> | parallel --bar -P 5 <somecmd>

O GNU 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:

Programação simples

O GNU Parallel gera um novo processo quando se termina - mantendo as CPUs ativas e economizando tempo:

Programação paralela GNU

Instalação

Uma instalação pessoal não requer acesso root. Isso pode ser feito em 10 segundos, fazendo o seguinte:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

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-mails para obter suporte: https://lists.gnu.org/mailman/listinfo/parallel

Ole Tange
fonte
1
muito obrigado (pela resposta e por escrever o software!), funciona muito bem!
Greg Sadetsky
9

Você pode usar o pv:

cat <someinput> | pv -p -s sizeof_someimput | xargs -n 1 -P 5 <somecmd>

Com isso, você saberá onde está a leitura de alguma imputação , assim saberá aproximadamente onde está o tratamento de alguma imputada .

DrGkill
fonte
1
Outro caso de uso frequente pode ser a combinação com find:FIND=( find "$DIR" -type f ) && ${FIND[@]} -print0 | pv -0lps $(${FIND[@]} | wc -l) | xargs -0 -I {} -P 5 <somecmd>
mxmlnkn
3

Se você está procurando apenas uma indicação geral do progresso, o método mais simples é ecoar antes de executar o comando que você deseja executar.

Exemplo: cat <someinput> | xargs -I{} sh -c 'echo {}; <somecmd>;'

-I{}define {}a cadeia atual que está sendo processada

sh -cpermitirá que você execute vários comandos (nota: ponto e vírgula após cada comando ser necessário, incluindo o último .

Zaheer
fonte