Com o GNU xargs
:
seq 1000 | xargs -P4 -n1 sh -c 'exec ./pgm -a "file$1" -b 12 > "out.$1"' sh &
Correria até 4 ./pgm
s em paralelo.
Caso contrário, com pdksh
/ mksh
/ oksh
:
trap : CHLD
n=0
for f in file*; do
jobs=$(jobs | wc -l)
if (($jobs < 4)); then
./pgm "$f" > out.$((++n)) &
else
wait
fi
done
trap - CHLD
wait
os detalhes da manipulação de sinal variam de um shell para o próximo. Esse truque funciona em pdksh
e seus derivados, mas não em qualquer outro shell que eu tentei. Você precisa de um shell onde seja possível capturar SIGCHLD (exclui bash
), onde o manipulador SIGCHLD é executado imediatamente (não bloqueado durante um wait
) (exclui ash
, yash
), onde o processamento do SIGCHLD interrompe o wait
(exclui ksh93
e zsh
).
Em shells que não sejam bash
, você também pode procurar abordagens em que as tarefas são iniciadas no manipulador SIGCHLD.