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 -P20
soll höchstens 20 $cmd
gleichzeitig ausführen .
-L10
begrenzt die Rate auf 10 Bytes pro Sekunde, also 5 Zeilen pro Sekunde.
Wenn Ihr $cmd
s zwei langsam wird und das Limit von 20 erreicht, xargs
hört das Lesen auf, bis $cmd
mindestens eine Instanz zurückkehrt. pv
schreibt 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 pv
wird aufhören zu schreiben. Aber selbst dann, wenn xargs
das Lesen fortgesetzt wird, pv
wird 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, zsh
wenn Ihr sleep
Befehl 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-command
s jedoch nicht begrenzt.