Su un sistema GNU e se hai pv
, potresti fare:
cmd='
that command | to execute &&
as shell code'
yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh
L' -P20
esecuzione è al massimo 20 $cmd
contemporaneamente.
-L10
limita la velocità a 10 byte al secondo, quindi 5 righe al secondo.
Se i tuoi $cmd
s diventano due lenti e provoca il raggiungimento del limite di 20, allora xargs
smetterà di leggere fino $cmd
a quando almeno un'istanza non ritorna. pv
continuerà comunque a scrivere sulla pipe alla stessa velocità, fino a quando la pipe non si riempie (che su Linux con una dimensione di pipe predefinita di 64 KiB richiederà quasi 2 ore).
A quel punto, pv
smetterà di scrivere. Ma anche allora, quando xargs
riprenderà a leggere, pv
proverà a recuperare e inviare tutte le righe che avrebbe dovuto inviare prima il più rapidamente possibile in modo da mantenere una media di 5 righe al secondo nel complesso.
Ciò significa che, finché sarà possibile con 20 processi per soddisfare quel 5 run al secondo in media, lo farà. Tuttavia, quando viene raggiunto il limite, la velocità con cui vengono avviati i nuovi processi non sarà guidata dal timer di pv ma dalla velocità con cui ritornano le precedenti istanze cmd. Ad esempio, se 20 sono attualmente in esecuzione e sono stati per 10 secondi e 10 di loro decidono di terminare tutti contemporaneamente, quindi ne verranno avviati 10 nuovi contemporaneamente.
Esempio:
$ 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
In media, sarà 5 volte al secondo anche se il ritardo tra due corse non sarà sempre esattamente di 0,2 secondi.
Con ksh93
(o con zsh
se il tuo sleep
comando supporta i secondi frazionari):
typeset -F SECONDS=0
n=0; while true; do
your-command &
sleep "$((++n * 0.2 - SECONDS))"
done
Ciò non pone limiti al numero di concorrenti contemporaneamente your-command
.