ฉันมีสคริปต์ทุบตีที่มีลักษณะเช่นนี้:
#!/bin/bash
wget LINK1 >/dev/null 2>&1
wget LINK2 >/dev/null 2>&1
wget LINK3 >/dev/null 2>&1
wget LINK4 >/dev/null 2>&1
# ..
# ..
wget LINK4000 >/dev/null 2>&1
แต่การประมวลผลแต่ละบรรทัดจนกว่าคำสั่งจะเสร็จสิ้นจากนั้นการย้ายไปยังบรรทัดถัดไปนั้นใช้เวลานานมากฉันต้องการประมวลผลอินสแตนซ์ 20 บรรทัดในครั้งเดียวแล้วเมื่อประมวลผลเสร็จแล้วอีก 20 บรรทัด
ฉันคิดว่าwget LINK1 >/dev/null 2>&1 &
จะส่งคำสั่งไปที่พื้นหลังและดำเนินการต่อ แต่มี 4000 บรรทัดนี่หมายความว่าฉันจะมีปัญหาด้านประสิทธิภาพไม่พูดถึงการถูก จำกัด ในจำนวนกระบวนการที่ฉันควรเริ่มในเวลาเดียวกันดังนั้นจึงไม่ดี ความคิด
ทางออกหนึ่งที่ฉันคิดในตอนนี้คือการตรวจสอบว่าหนึ่งในคำสั่งยังคงทำงานอยู่หรือไม่ตัวอย่างเช่นหลังจาก 20 บรรทัดฉันสามารถเพิ่มลูปนี้:
while [ $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done
แน่นอนในกรณีนี้ฉันจะต้องต่อท้าย & ท้ายบรรทัด! แต่ฉันรู้สึกว่านี่ไม่ใช่วิธีที่ถูกต้องที่จะทำ
ดังนั้นฉันจะจัดกลุ่มแต่ละ 20 บรรทัดด้วยกันและรอให้เสร็จก่อนที่จะไป 20 บรรทัดถัดไปสคริปต์นี้ถูกสร้างขึ้นแบบไดนามิกเพื่อให้ฉันสามารถทำสิ่งคณิตศาสตร์ที่ฉันต้องการในขณะที่มันถูกสร้างขึ้น แต่มันไม่จำเป็นต้อง ใช้ wget มันเป็นเพียงตัวอย่างดังนั้นทางออกที่เฉพาะเจาะจงคือ wget จะไม่ทำอะไรให้ฉันดี
wait
เป็นคำตอบที่ถูกต้องที่นี่ แต่คุณwhile [ $(ps …
จะเขียนได้ดีขึ้นwhile pkill -0 $KEYWORD…
- ใช้proctools ... นั่นคือเหตุผลที่ถูกต้องเพื่อตรวจสอบว่ากระบวนการที่มีชื่อเฉพาะยังคงทำงานอยู่หรือไม่