Câu trả lời:
#!/bin/bash
command1 &
command2 &
command3 &
wait
command4
wait
(không có bất kỳ đối số nào) sẽ đợi cho đến khi tất cả các quy trình nền đã thoát.
Mô tả đầy đủ wait
trong bash
hướng dẫn:
wait [-n] [n ...]
Đợi cho mỗi quá trình con được chỉ định và trả về trạng thái chấm dứt của nó. Mỗi
n
có thể là một ID quá trình hoặc một đặc tả công việc; nếu một đặc tả công việc được đưa ra, tất cả các quy trình trong đường ống của công việc đó sẽ được chờ đợi. Nếun
không được đưa ra, tất cả các quy trình con hiện đang hoạt động được chờ đợi và trạng thái trả về là 0. Nếu-n
tùy chọn được cung cấp,wait
đợi bất kỳ công việc nào kết thúc và trả về trạng thái thoát của nó. Nếun
chỉ định một quy trình hoặc công việc không tồn tại, trạng thái trả về là 127. Mặt khác, trạng thái trả về là trạng thái thoát của quy trình hoặc công việc cuối cùng được chờ đợi.
cmd1 & pids=( $! ); cmd2 & pids+=( $! ); cmd3 & pids+=( $! ); wait "${pids[@]}"
hoặc một cái gì đó tương tự.
Tôi thích wait
câu trả lời, nhưng giống như một bài tập học thuật, tôi nghĩ rằng nó cũng sẽ hoạt động:
bash -c 'command1 & command2 & command3 &' && command4
Xin hãy sửa tôi nếu tôi sai.
time bash -c "sleep 5 &sleep 5 &sleep 5 &" && echo foo
Nếu nó không nói lệnh bash mất năm giây, thì nó đã không làm những gì bạn muốn.
PID1=$!
và sau đó đợi tất cả chúng vớiwait "$PID1" "$PID2" "$PID3"
. Điều đó hơi phức tạp hơn một chút, nhưng sẽ hiệu quả nếu quy trình có những đứa trẻ khác mà bạn không muốn chờ đợi.