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 -P20
est d'exécuter au plus 20 $cmd
en même temps.
-L10
limite le débit à 10 octets par seconde, donc 5 lignes par seconde.
Si votre $cmd
s devient lent et fait atteindre la limite de 20, alors la xargs
lecture s'arrêtera jusqu'à ce qu'une $cmd
instance au moins revienne. pv
continuera à é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, pv
arrêtera d'écrire. Mais même alors, lorsque la xargs
lecture reprendra, pv
il 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 zsh
si votre sleep
commande 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-command
s simultanés .