একটি জিএনইউ সিস্টেমে এবং আপনার কাছে থাকলে 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পাইপটি পূর্ণ না হওয়া অবধি এখনও পাইপগুলিতে একই হারে লিখিতভাবে চালিয়ে যাবে (যা লিনাক্সে K৪ কেবিবিইনের ডিফল্ট পাইপের আকারের সাথে প্রায় ২ ঘন্টা সময় লাগবে)।
এই মুহুর্তে, pvলেখা বন্ধ হবে। তারপরেও, xargsপুনরায় পড়া শুরু করার পরে, pvচেষ্টা করা হবে এবং যত দ্রুত সম্ভব পাঠানো উচিত সমস্ত লাইনগুলি দ্রুত পাঠানো হবে যাতে সামগ্রিকভাবে প্রতি সেকেন্ডে 5 লাইন বজায় রাখতে পারে।
এর অর্থ হ'ল যতক্ষণ পর্যন্ত 20 প্রসেসের সাথে এটি সম্ভব হিসাবে গড়ে প্রতি সেকেন্ডে 5 রান পূরণ করা সম্ভব, এটি এটি করবে। তবে সীমাটি পৌঁছে গেলে, নতুন প্রসেসগুলি যে হারে প্রসেস শুরু হয় তা পিভির টাইমার দ্বারা চালিত হবে না তবে আগের সেমিডেন্সের দৃষ্টিতে যে হারে ফিরে আসে। উদাহরণস্বরূপ, যদি বর্তমানে 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 বার হবে।
সহ ksh93(বা zshযদি আপনার sleepকমান্ড ভগ্নাংশ সেকেন্ড সমর্থন করে) এর সাথে:
typeset -F SECONDS=0
n=0; while true; do
your-command &
sleep "$((++n * 0.2 - SECONDS))"
done
এটি your-commandযদিও সমবর্তী সংখ্যার উপর কোনও আবদ্ধ রাখে না ।