รันคำสั่ง bash หลังจากคำสั่งพร้อมกันไหม?


13

ฉันต้องการเรียกใช้คำสั่งแบบขนาน เมื่อคำสั่งทั้งหมดเหล่านี้เสร็จสิ้นให้เริ่มต้นคำสั่งถัดไป ฉันว่าแนวทางต่อไปนี้จะได้ผล

#!/bin/bash
command1 &
command2 &
command3 &&
command4

แต่มันก็ไม่ได้ ฉันจำเป็นต้องเรียกใช้command4เมื่อคำสั่งสามคำแรกเสร็จสิ้นสมบูรณ์

คำตอบ:


28
#!/bin/bash
command1 &
command2 &
command3 &

wait
command4

wait (ไม่มีข้อโต้แย้งใด ๆ ) จะรอจนกว่ากระบวนการพื้นหลังทั้งหมดจะออก

คำอธิบายที่สมบูรณ์ของwaitในbashคู่มือ:

wait [-n] [n ...]

รอแต่ละกระบวนการลูกที่ระบุและส่งกลับสถานะการเลิกจ้าง แต่ละคนnอาจเป็น ID กระบวนการหรือข้อกำหนดงาน ถ้า spec ของงานได้รับกระบวนการทั้งหมดในขั้นตอนการทำงานของงานนั้นจะถูกรอ หากnไม่ได้รับกระบวนการลูกที่ใช้งานอยู่ในปัจจุบันทั้งหมดจะรอและสถานะการส่งคืนเป็นศูนย์ หาก -nมีการจัดหาตัวเลือกให้waitรองานใด ๆ เพื่อยกเลิกและส่งคืนสถานะการออก หากnระบุกระบวนการหรืองานที่ไม่มีอยู่สถานะการส่งคืนคือ 127 มิฉะนั้นสถานะการส่งคืนคือสถานะการออกของกระบวนการสุดท้ายหรืองานที่รอ


1
อีกตัวเลือกหนึ่งคือการบันทึก PID ของเด็กแต่ละคนใช้สิ่งที่ต้องการแล้วรอให้ทั้งหมดของพวกเขาด้วยPID1=$! wait "$PID1" "$PID2" "$PID3"มันซับซ้อนกว่านี้เล็กน้อย แต่จะใช้งานได้หากกระบวนการมีเด็กคนอื่นซึ่งคุณไม่ต้องการรอ
kasperd

1
@kasperd ดีกว่าด้วยอาร์เรย์ในกรณีนั้น: cmd1 & pids=( $! ); cmd2 & pids+=( $! ); cmd3 & pids+=( $! ); wait "${pids[@]}"หรือสิ่งที่คล้ายกัน
Kusalananda

@kasperd โดย "ดีกว่า" ฉันหมายถึง "ใช้เพียงหนึ่งตัวแปร" ไม่มีอะไรผิดปกติกับการใช้งานจำนวนมากและอาจจะโอเคสำหรับกรณีเล็ก ๆ เช่นนี้
Kusalananda

0

ฉันชอบwaitคำตอบ แต่เป็นแบบฝึกหัดทางวิชาการฉันคิดว่าสิ่งนี้จะใช้ได้เช่นกัน:

bash -c 'command1 & command2 & command3 &' && command4

โปรดแก้ไขฉันหากฉันผิด


2
คุณทดสอบสิ่งนี้หรือไม่? มันไม่ทำงานอย่างแน่นอน ตัวอย่าง: time bash -c "sleep 5 &sleep 5 &sleep 5 &" && echo foo ถ้าไม่บอกว่าคำสั่ง bash ใช้เวลาห้าวินาทีมันไม่ได้ทำตามที่คุณต้องการ
Seth Robertson

ฉันทดสอบด้วยการนอนหลับและเสียงสะท้อนและดูเหมือนว่าจะทำงาน ตัวอย่างของคุณพิสูจน์เป็นอย่างอื่น
เบอร์เกอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.