Chạy các lệnh song song và đợi một nhóm lệnh kết thúc trước khi bắt đầu tiếp theo


12

Tôi có kịch bản bao gồm nhiều lệnh. Làm cách nào tôi có thể nhóm các lệnh để chạy cùng nhau (Tôi muốn tạo một số nhóm lệnh. Trong mỗi nhóm, các lệnh sẽ chạy song song (cùng một lúc). Các nhóm nên chạy tuần tự, đợi một nhóm kết thúc trước khi bắt đầu nhóm tiếp theo) ... tức là

#!/bin/bash
command #1
command #2
command #3
command #4
command #5
command #6
command #7
command #8
command #9
command #10

Làm thế nào tôi có thể chạy mỗi 3 lệnh để nhận được? Tôi đã thử:

#!/bin/bash
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10

Nhưng điều này không hoạt động đúng (tôi muốn chạy các nhóm lệnh song song cùng một lúc. Ngoài ra tôi cần đợi nhóm đầu tiên kết thúc trước khi chạy nhóm tiếp theo)

Kịch bản đang thoát với một thông báo lỗi!


2
Ý bạn là gì, chạy cùng nhau. Bạn có nghĩa là chạy song song cùng một lúc? Làm thế nào để bạn biết nó "không hoạt động đúng?" Làm thế nào bạn sẽ biết khi nó hoạt động đúng? Bạn có muốn đợi nhóm đầu tiên kết thúc trước khi chạy nhóm tiếp theo không?
RobertL

@ RobertL. Có nghĩa là tôi song song cùng một lúc. Kịch bản đang thoát với một thông báo lỗi. Có, tôi cần đợi nhóm thứ nhất kết thúc trước khi chạy nhóm tiếp theo.

1
@goro trích dẫn bạn, đoạn script đang thoát với thông báo lỗi. Vui lòng chỉnh sửa câu hỏi của bạn để thêm tin nhắn đó (vì mục đích hoàn thành) và xóa chit-chat (lời khuyên được đánh giá cao).
dave_alcarin

Có phải cùng một lệnh chạy trong mỗi trường hợp? Cùng tên?
RobertL

1
@goro, cái này có chính xác không? "Bạn có một số nhóm lệnh. Trong mỗi nhóm, các lệnh sẽ chạy song song (cùng một lúc). Các nhóm nên chạy tuần tự, đợi một nhóm kết thúc trước khi bắt đầu nhóm tiếp theo."
RobertL

Câu trả lời:


20

Các lệnh trong mỗi nhóm chạy song song và các nhóm chạy tuần tự, mỗi nhóm lệnh song song chờ nhóm trước kết thúc trước khi bắt đầu thực hiện.

Sau đây là một ví dụ hoạt động:

Giả sử 3 nhóm lệnh như trong đoạn mã dưới đây. Trong mỗi nhóm, ba lệnh được bắt đầu trong nền với &.

3 lệnh sẽ được bắt đầu gần như cùng một lúc và chạy song song trong khi kịch bản waitsđể chúng hoàn thành.

Sau khi cả ba lệnh trong lối thoát nhóm thứ ba, command 10sẽ thực thi.

$ cat command_groups.sh 
#!/bin/sh

command() {
    echo $1 start
    sleep $(( $1 & 03 ))      # keep the seconds value within 0-3
    echo $1 complete
}

echo First Group:
command 1 &
command 2 &
command 3 &
wait

echo Second Group:
command 4 &
command 5 &
command 6 &
wait

echo Third Group:
command 7 &
command 8 &
command 9 &
wait

echo Not really a group, no need for background/wait:
command 10

$ sh command_groups.sh 
First Group:
1 start
2 start
3 start
1 complete
2 complete
3 complete
Second Group:
4 start
5 start
6 start
4 complete
5 complete
6 complete
Third Group:
7 start
8 start
9 start
8 complete
9 complete
7 complete
Not really a group, no need for background/wait:
10 start
10 complete
$   

Tôi nghĩ rằng các curlies là hoàn toàn vô nghĩa trong ví dụ của bạn, mặc dù. Chờ đợi là quá trình toàn cầu, và các nhóm cuộn tròn sẽ không tạo ra một ngã ba mới trong trường hợp này.
PSkocik

1
@PSkocik, Đúng. Cơ quan tiền đình.
RobertL

6
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
wait #<===

Nên hoạt động (mỗi thành phần bộ ba riêng lẻ sẽ chạy tuần tự, nhưng các nhóm hte sẽ chạy song song). Bạn có thể không muốn shell cha của mình thoát ra trước khi các nhóm kết thúc - do đó wait.


2
Câu hỏi ban đầu chỉ nói "chạy mỗi 3 lệnh cùng nhau". Không làm rõ, một trong hai câu trả lời là chính xác. Cuộc gọi tốt trên wait.
RobertL
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.