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
-P20En 20'de yürütmektir $cmdaynı anda.
-L10 hızı saniyede 10 bayt, yani saniyede 5 satır ile sınırlar.
Eğer $cmds'iniz yavaşlarsa ve 20 limitine ulaşılırsa, en az xargsbir $cmdörnek geri dönene kadar okumayı durduracaktır . pvboru doluncaya kadar aynı oranda borsaya yazmaya devam edecek (varsayılan 64KiB boruyla Linux'ta yaklaşık 2 saat sürecek).
Bu noktada, pvyazma durur. Ancak o zaman bile xargsokumaya devam ederken , pvgenel 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 zshsizin eğer sleepkomut fraksiyonel saniye destekler):
typeset -F SECONDS=0
n=0; while true; do
your-command &
sleep "$((++n * 0.2 - SECONDS))"
done
Bu eşzamanlı your-commands sayısına bağlı değildir .