명령을 병렬로 실행하고 다음 명령 세트를 시작하기 전에 한 명령 세트가 완료될 때까지 기다립니다.

명령을 병렬로 실행하고 다음 명령 세트를 시작하기 전에 한 명령 세트가 완료될 때까지 기다립니다.

여러 명령이 포함된 스크립트가 있습니다. 실행하기 위해 명령을 그룹화하는 방법(여러 개의 명령 그룹을 만들고 싶습니다. 각 그룹 내에서 명령은 병렬로(동시에) 실행되어야 합니다. 그룹은 다음 그룹을 시작하기 전에 한 그룹이 완료될 때까지 기다려야 순서대로 실행되어야 합니다.) ...즉.

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

3개의 명령을 동시에 어떻게 실행할 수 있나요? 나는 시도했다:

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

하지만 이것은 제대로 작동하지 않습니다. (동시에 여러 명령 세트를 병렬로 실행하고 싶습니다. 또한 다음 세트를 실행하기 전에 첫 번째 세트가 완료될 때까지 기다려야 합니다.)

스크립트가 오류 메시지와 함께 종료됩니다!

답변1

각 그룹 내의 명령은 병렬로 실행되고, 각 그룹은 순서대로 실행되며, 각 병렬 명령 그룹은 실행을 시작하기 전에 이전 명령 그룹이 완료될 때까지 기다립니다.

실제 예는 다음과 같습니다.

아래 코드에 표시된 대로 3개의 명령 세트가 있다고 가정합니다. 각 그룹에서 이 세 가지 명령은 백그라운드에서 실행됩니다 &.

이 3개 명령은 거의 동시에 시작되어 스크립트가 waits완료되도록 하는 동안 병렬로 실행됩니다.

세 번째 그룹의 세 명령은 command 10세 명령이 모두 종료될 때까지 실행되지 않습니다.

$ 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
$   

답변2

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

작동해야 합니다(각 개별 삼중항 구성 요소는 순차적으로 실행되지만 hte 그룹은 병렬로 실행됩니다). 그룹이 완료되기 전에 상위 쉘이 종료되는 것을 원하지 않을 것입니다 wait.

관련 정보