Estou usando xargs
com a opção --max-args=0
(como alternativa -P 0
).
No entanto, a saída dos processos é mesclada no stdout
fluxo sem levar em consideração a separação de linha adequada. Então, muitas vezes acabo com linhas como:
<start-of-line-1><line-2><end-of-line-1>
Como eu estou usando egrep
com ^
no meu padrão em toda a xargs
saída isto é estragar o meu resultado.
Existe alguma maneira de forçar xargs
a gravação das saídas do processo em ordem (qualquer ordem, desde que a saída de um processo seja contígua)?
Ou alguma outra solução?
Edit: mais detalhes sobre o caso de uso:
Quero baixar e analisar páginas da web de diferentes hosts. Como cada página leva cerca de um segundo para carregar e há algumas dúzias de páginas, eu quero paralelizar as solicitações.
Meu comando tem o seguinte formato:
echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'
Eu uso o bash e não algo como Perl porque os IPs do host (a variável $ IPs) e alguns outros dados vêm de um arquivo bash incluído.
fonte
xargs
.xargs
parece não fornecer esse recurso.make
o recurso de trabalhos, acho quemake
mescla as linhas de saída corretamente.--line-buffered
bandeira paraegrep
ajudaRespostas:
Isso deve fazer o truque:
A idéia aqui é fazer contagens separadas e somar no final. Pode falhar se as contagens separadas forem grandes o suficiente para serem misturadas, mas não deve ser o caso.
fonte
O GNU Parallel foi projetado especificamente para resolver este problema:
Se seus IPs estão em um arquivo, é ainda mais bonito:
Para saber mais, assista ao vídeo de introdução: http://www.youtube.com/watch?v=OpaiGYxkSuQ
fonte
parallel
comando do moreutils , o que é suficiente aqui:parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs