Sur un système GNU et si vous l'avez fait pv, vous pouvez faire:
cmd='
that command | to execute &&
as shell code'
yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh
Le -P20est d'exécuter au plus 20 $cmden même temps.
-L10 limite le débit à 10 octets par seconde, donc 5 lignes par seconde.
Si votre $cmds devient lent et fait atteindre la limite de 20, alors la xargslecture s'arrêtera jusqu'à ce qu'une $cmdinstance au moins revienne. pvcontinuera à écrire sur le canal au même rythme, jusqu'à ce que le canal soit plein (ce qui sous Linux avec une taille de canal par défaut de 64 Ko prendra près de 2 heures).
À ce stade, pvarrêtera d'écrire. Mais même alors, lorsque la xargslecture reprendra, pvil tentera de rattraper son retard et d'envoyer toutes les lignes qu'il aurait dû envoyer le plus rapidement possible afin de maintenir une moyenne globale de 5 lignes par seconde.
Ce que cela signifie, c'est que tant qu'il est possible avec 20 processus de répondre à 5 besoins par seconde en moyenne, il le fera. Cependant, lorsque la limite est atteinte, la vitesse à laquelle les nouveaux processus sont démarrés ne sera pas pilotée par le temporisateur de pv mais par la vitesse à laquelle les instances cmd précédentes reviennent. Par exemple, si 20 sont en cours d'exécution et durent 10 secondes, et que 10 d'entre eux décident de tout terminer en même temps, 10 nouveaux seront démarrés en même temps.
Exemple:
$ cmd='date +%T.%N; exec sleep 2'
$ yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh
09:49:23.347013486
09:49:23.527446830
09:49:23.707591664
09:49:23.888182485
09:49:24.068257018
09:49:24.338570865
09:49:24.518963491
09:49:24.699206647
09:49:24.879722328
09:49:25.149988152
09:49:25.330095169
En moyenne, il sera de 5 fois par seconde même si le délai entre deux runs ne sera pas toujours exactement de 0,2 seconde.
Avec ksh93(ou avec zshsi votre sleepcommande prend en charge les fractions de seconde):
typeset -F SECONDS=0
n=0; while true; do
your-command &
sleep "$((++n * 0.2 - SECONDS))"
done
Cela ne met cependant aucune limite sur le nombre de your-commands simultanés .