ในระบบ 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-command
s พร้อมกัน