Chạy lệnh bash sau một số lệnh đồng thời?


13

Tôi muốn chạy một số lệnh song song. Khi tất cả các lệnh này kết thúc, bắt đầu tiếp theo. Tôi mặc dù cách tiếp cận sau đây sẽ làm việc

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

Nhưng nó đã không. Tôi cần chạy command4khi tất cả ba lệnh đầu tiên đã hoàn thành.

Câu trả lời:


28
#!/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 đủ waittrong bashhướ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 ncó 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ếu nkhô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 -ntù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ếu nchỉ đị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.


1
Một lựa chọn khác là lưu PID của mỗi đứa trẻ bằng cách sử dụng một cái gì đó như thế PID1=$!và sau đó đợi tất cả chúng với wait "$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.
kasperd

1
@kasperd Tốt hơn với một mảng trong trường hợp đó: cmd1 & pids=( $! ); cmd2 & pids+=( $! ); cmd3 & pids+=( $! ); wait "${pids[@]}"hoặc một cái gì đó tương tự.
Kusalananda

@kasperd Bởi "tốt hơn" Ý tôi là "chỉ sử dụng một biến". Không có gì sai khi sử dụng nhiều, và có lẽ hoàn toàn ổn đối với các trường hợp nhỏ như thế này.
Kusalananda

0

Tôi thích waitcâ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.


2
Bạn đã kiểm tra điều này? Nó hoàn toàn không hoạt động. Ví dụ: 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.
Seth Robertson

Tôi đã thử nó với giấc ngủ và tiếng vang và nó dường như hoạt động. Ví dụ của bạn chứng minh khác.
burger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.