GNU सिस्टम पर और यदि आपके पास है pv, तो आप कर सकते हैं:
cmd='
that command | to execute &&
as shell code'
yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh
-P20सबसे 20 पर अमल करने के लिए है $cmdएक ही समय में।
-L10 दर को प्रति सेकंड 10 बाइट्स तक सीमित करता है, इसलिए प्रति सेकंड 5 लाइनें।
यदि आपका $cmdएस दो धीमा हो जाता है और 20 सीमा तक पहुंचने का कारण बनता है, तो कम से कम रिटर्न पर xargsएक $cmdउदाहरण तक पढ़ना बंद कर देगा । pvअभी भी पाइप पर उसी दर से लिखना जारी रहेगा, जब तक कि पाइप पूरा नहीं हो जाता (जो कि लिनक्स पर 64KiB के डिफ़ॉल्ट पाइप आकार के साथ लगभग 2 घंटे का समय लगेगा)।
उस बिंदु पर, pvलिखना बंद कर देंगे। लेकिन फिर भी, जब xargsपढ़ना फिर से शुरू होता है, तो pvवह कोशिश करेगा और पकड़ लेगा और वह सभी लाइनें भेजेगा जो उसे पहले जितनी जल्दी संभव हो उतनी जल्दी भेजनी चाहिए ताकि कुल मिलाकर प्रति सेकंड 5 लाइनों को बनाए रखा जा सके।
इसका मतलब यह है कि जब तक कि 20 प्रक्रियाओं के साथ यह संभव है कि 5 प्रति सेकंड औसत आवश्यकता पर पूरा किया जाए, तो वह ऐसा करेगा। हालाँकि जब सीमा पूरी हो जाती है, तो जिस दर से नई प्रक्रियाएँ शुरू की जाती हैं, वह pv के टाइमर से नहीं, बल्कि उस दर से चलती है जिस पर पहले cmd इंस्टेंस वापस आता है। उदाहरण के लिए, यदि 20 वर्तमान में चल रहे हैं और 10 सेकंड के लिए हैं, और उनमें से 10 एक ही समय में समाप्त करने का निर्णय लेते हैं, तो 10 नए एक ही बार शुरू किए जाएंगे।
उदाहरण:
$ 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
औसतन, यह प्रति सेकंड 5 गुना होगा भले ही दो रन के बीच देरी हमेशा 0.2 सेकंड नहीं होगी।
के साथ ksh93(या zshयदि आपका sleepआदेश आंशिक सेकंड का समर्थन करता है):
typeset -F SECONDS=0
n=0; while true; do
your-command &
sleep "$((++n * 0.2 - SECONDS))"
done
your-commandहालांकि समवर्ती एस की संख्या पर कोई सीमा नहीं है ।