ดังนั้นฉันมีวงขณะที่:
cat live_hosts | while read host; do \
sortstuff.sh -a "$host" > sortedstuff-"$host"; done
แต่อาจใช้เวลานาน ฉันจะใช้ GNU Parallel ในขณะนี้ได้อย่างไร
ดังนั้นฉันมีวงขณะที่:
cat live_hosts | while read host; do \
sortstuff.sh -a "$host" > sortedstuff-"$host"; done
แต่อาจใช้เวลานาน ฉันจะใช้ GNU Parallel ในขณะนี้ได้อย่างไร
คำตอบ:
คุณไม่ได้ใช้การวนรอบสักครู่
parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts
โปรดทราบว่าสิ่งนี้จะไม่ทำงานหากคุณมีเส้นทางในlive_hosts
(เช่น/some/dir/file
) ตามที่จะขยายเป็นsortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file
(ทำให้เกิดno such file or directory
); สำหรับกรณีเหล่านั้นใช้{//}
และ{/}
(ดูgnu-parallel
คู่มือสำหรับรายละเอียด):
parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
>
ด้วย| tee
เช่นคำสั่งแรกจะกลายเป็น parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
ในฐานะที่เป็นโรงเรียนเก่า "ทำสิ่งหนึ่งและทำมันให้ดี" คนที่แต่งตัวประหลาด Unix ฉันจะใส่สิ่งที่ใช้แทนสตริงลงในสคริปต์ตัวคลุม:
#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"
ถ้าคุณเรียกมันว่าwrapper.sh
ที่parallel
คำสั่งจะเรียกมันว่าจะเป็น:
parallel wrapper.sh < live_hosts
โปรดทราบว่าคุณไม่จำเป็นต้องcat
ใช้สิ่งนี้ซึ่งบันทึกการเรียกใช้โปรแกรมภายนอก
คุณไม่ต้องการ parallel
เนื่องจากเนื้อหาของลูปไม่ได้ขึ้นอยู่กับการวนซ้ำก่อนหน้านี้ เพียงแค่เริ่มกระบวนการพื้นหลังใหม่สำหรับแต่ละโฮสต์
while read host; do
sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait # Optional, to block until the background tasks are done
parallel
ทำให้การจัดการด้านบางอย่างง่ายขึ้น คุณสามารถ จำกัด จำนวนของงานที่ทำงานแบบขนานได้ง่ายขึ้น
wc -l live_hosts
มีมากกว่าจำนวนแกนดิสก์หรือแกนประมวลผล CPU - ขึ้นอยู่กับว่างานคือ I / O หรือ CPU-bound คุณจะกินข้อได้เปรียบมากมายที่คุณได้รับจากการขนานกันด้วยวิธีแก้ปัญหาเช่นนั้น ความสามารถในparallel
การ จำกัด จำนวนของงานไม่ได้เป็นเพียงเรื่องดีมันเป็นเรื่องสำคัญหากความเร็วในการประมวลผลเป็นเป้าหมายของคุณ
tee
กับparallel
เมื่อใส่เอาท์พุทเข้าsortedstuff
? ดังนั้นฉันสามารถดูผลลัพธ์ได้