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.