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
हालांकि समवर्ती एस की संख्या पर कोई सीमा नहीं है ।