ปัญหาที่พบที่นี่คือคุณต้องรอให้โปรแกรมที่คุณเรียกใช้จากสคริปต์ของคุณทำงานเสร็จสิ้น
หากในสคริปต์ของคุณคุณเรียกใช้โปรแกรมในพื้นหลังคุณสามารถลองอะไรเพิ่มเติมได้
โดยทั่วไปการโทรไปยังsync
ก่อนที่คุณจะออกจะอนุญาตให้ล้างบัฟเฟอร์ระบบไฟล์และสามารถช่วยได้เล็กน้อย
หากในสคริปต์คุณเริ่มบางโปรแกรมในพื้นหลัง ( &
) คุณสามารถรอให้โปรแกรมเสร็จสิ้นก่อนที่คุณจะออกจากสคริปต์ หากต้องการทราบวิธีการทำงานคุณสามารถดูด้านล่าง
#!/bin/bash
program_1 &
PID_PROGRAM_1=${!}
program_2 &
wait ${!}
daemon_1 &
program_3 &
PID_PROGRAM_3=${!}
sync
wait $PID_PROGRAM_1
wait $PID_PROGRAM_3
เนื่องจากใช้wait
งานได้กับงานและPID
ตัวเลขการแก้ปัญหาที่ขี้เกียจควรวางไว้ที่ส่วนท้ายของสคริปต์
for job in `jobs -p`
do
wait $job
done
สถานการณ์จะยากขึ้นถ้าคุณรันบางสิ่งที่รันอย่างอื่นในเบื้องหลังเพราะคุณต้องค้นหาและรอ (ถ้าเป็นกรณีนี้) จุดสิ้นสุดของกระบวนการลูกทั้งหมด: ตัวอย่างเช่นถ้าคุณรันdaemonอาจจะไม่ใช่กรณีนี้ เพื่อรอให้เสร็จสิ้น :-)
บันทึก:
รอ $ {!} หมายถึง "รอจนกว่ากระบวนการพื้นหลังสุดท้ายจะเสร็จสิ้น" โดยที่$!
PID ของกระบวนการพื้นหลังสุดท้ายอยู่ที่ไหน ดังนั้นการใส่wait ${!}
เพียงหลังprogram_2 &
จะเทียบเท่ากับการดำเนินการโดยตรงprogram_2
โดยไม่ต้องส่งในพื้นหลังด้วย&
จากความช่วยเหลือของwait
:
Syntax
wait [n ...]
Key
n A process ID or a job specification