Bir GNU sisteminde ve eğer varsa pv
, şunları yapabilirsiniz:
cmd='
that command | to execute &&
as shell code'
yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh
-P20
En 20'de yürütmektir $cmd
aynı anda.
-L10
hızı saniyede 10 bayt, yani saniyede 5 satır ile sınırlar.
Eğer $cmd
s'iniz yavaşlarsa ve 20 limitine ulaşılırsa, en az xargs
bir $cmd
örnek geri dönene kadar okumayı durduracaktır . pv
boru doluncaya kadar aynı oranda borsaya yazmaya devam edecek (varsayılan 64KiB boruyla Linux'ta yaklaşık 2 saat sürecek).
Bu noktada, pv
yazma durur. Ancak o zaman bile xargs
okumaya devam ederken , pv
genel olarak saniyede ortalama 5 satır tutabilmek için mümkün olan en kısa sürede göndermesi gereken tüm satırları yakalamaya ve yakalamaya çalışacaktır.
Bunun anlamı, ortalama olarak ihtiyaç duyulan saniyede 5 çalıştırmayı karşılamak için 20 işlemle mümkün olduğu sürece, bunu yapmasıdır. Bununla birlikte, sınıra ulaşıldığında, yeni işlemlerin başlatılma hızı, pv'nin zamanlayıcısı tarafından değil, daha önceki cmd örneklerinin geri dönme hızına bağlı olacaktır. Örneğin, 20 şu anda çalışıyorsa ve 10 saniyedir çalışıyorsa ve 10 tanesi aynı anda bitirmeye karar verirse, bir kerede 10 yenisi başlayacaktır.
Örnek:
$ 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
İki çalışma arasındaki gecikme her zaman tam olarak 0,2 saniye olmasa da ortalama olarak, saniyede 5 kez olacaktır.
İle ksh93
(ya da zsh
sizin eğer sleep
komut fraksiyonel saniye destekler):
typeset -F SECONDS=0
n=0; while true; do
your-command &
sleep "$((++n * 0.2 - SECONDS))"
done
Bu eşzamanlı your-command
s sayısına bağlı değildir .