Auf einem GNU-System und wenn Sie haben pv, können Sie Folgendes tun:
cmd='
that command | to execute &&
as shell code'
yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh
Der -P20soll höchstens 20 $cmdgleichzeitig ausführen .
-L10 begrenzt die Rate auf 10 Bytes pro Sekunde, also 5 Zeilen pro Sekunde.
Wenn Ihr $cmds zwei langsam wird und das Limit von 20 erreicht, xargshört das Lesen auf, bis $cmdmindestens eine Instanz zurückkehrt. pvschreibt weiterhin mit der gleichen Rate an die Pipe, bis die Pipe voll ist (was unter Linux mit einer Standard-Pipe-Größe von 64 KB fast 2 Stunden dauert).
An diesem Punkt pvwird aufhören zu schreiben. Aber selbst dann, wenn xargsdas Lesen fortgesetzt wird, pvwird versucht, alle Zeilen, die es früher hätte senden sollen, so schnell wie möglich einzuholen und zu senden, um insgesamt einen Durchschnitt von 5 Zeilen pro Sekunde aufrechtzuerhalten.
Das heißt, solange es mit 20 Prozessen möglich ist, diese 5 Durchläufe pro Sekunde im Durchschnitt zu erreichen, wird es dies tun. Wenn das Limit erreicht ist, wird die Rate, mit der neue Prozesse gestartet werden, nicht vom Timer von pv gesteuert, sondern von der Rate, mit der frühere cmd-Instanzen zurückkehren. Wenn zum Beispiel derzeit 20 ausgeführt werden und 10 Sekunden vergangen sind und 10 von ihnen sich dafür entscheiden, alle gleichzeitig zu beenden, werden sofort 10 neue gestartet.
Beispiel:
$ 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
Im Durchschnitt sind es 5-mal pro Sekunde, auch wenn die Verzögerung zwischen zwei Läufen nicht immer genau 0,2 Sekunden beträgt.
Mit ksh93(oder mit, zshwenn Ihr sleepBefehl Sekundenbruchteile unterstützt):
typeset -F SECONDS=0
n=0; while true; do
your-command &
sleep "$((++n * 0.2 - SECONDS))"
done
Damit ist die Anzahl der gleichzeitigen your-commands jedoch nicht begrenzt.