ในระบบ 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จะยังคงเขียนต่อไปยังไปป์ในอัตราเดียวกันจนกว่าไปป์จะเต็ม (ซึ่งบน Linux ที่มีขนาดไพพ์เริ่มต้นที่ 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-commands พร้อมกัน