En un sistema GNU y si lo tiene pv
, podría hacer:
cmd='
that command | to execute &&
as shell code'
yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh
El -P20
es ejecutar como máximo 20 $cmd
al mismo tiempo.
-L10
limita la velocidad a 10 bytes por segundo, por lo que 5 líneas por segundo.
Si sus $cmd
s se vuelven dos lentos y hace que se alcance el límite de 20, xargs
dejará de leer hasta que $cmd
al menos una instancia regrese. pv
seguirá escribiendo en la tubería a la misma velocidad, hasta que la tubería se llene (lo que en Linux con un tamaño de tubería predeterminado de 64 KB tomará casi 2 horas).
En ese punto, pv
dejará de escribir. Pero incluso entonces, cuando xargs
reanude la lectura, pv
intentará ponerse al día y enviar todas las líneas que debería haber enviado antes lo antes posible para mantener un promedio general de 5 líneas por segundo.
Lo que eso significa es que, siempre que sea posible con 20 procesos para cumplir con ese requisito promedio de 5 ejecuciones por segundo, lo hará. Sin embargo, cuando se alcanza el límite, la velocidad a la que se inician los nuevos procesos no será controlada por el temporizador de pv, sino por la velocidad a la que regresan las instancias de cmd anteriores. Por ejemplo, si 20 se están ejecutando actualmente y lo han estado durante 10 segundos, y 10 de ellos deciden terminar todo al mismo tiempo, se iniciarán 10 nuevos a la vez.
Ejemplo:
$ 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 promedio, será 5 veces por segundo, incluso si el retraso entre dos ejecuciones no siempre será exactamente 0.2 segundos.
Con ksh93
(o con zsh
si su sleep
comando admite segundos fraccionarios):
typeset -F SECONDS=0
n=0; while true; do
your-command &
sleep "$((++n * 0.2 - SECONDS))"
done
Sin your-command
embargo, eso no limita el número de correos electrónicos concurrentes .