명령을 병렬로 실행하고 다음 명령을 시작하기 전에 한 명령 그룹이 완료 될 때까지 기다리십시오.


12

여러 명령을 포함하는 스크립트가 있습니다. 명령이 함께 실행되도록 그룹화하는 방법 (여러 명령 그룹을 만들고 싶습니다. 각 그룹 내에서 명령이 동시에 실행되어야 함) 그룹은 순차적으로 실행되어야합니다. 다음 그룹) ... 즉

#!/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

그러나 이것은 제대로 작동하지 않았습니다 (동시에 명령 그룹을 동시에 실행하고 싶습니다. 또한 다음 그룹을 실행하기 전에 첫 번째 그룹이 끝날 때까지 기다려야합니다)

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


2
무슨 소리 야 함께 달려 동시에 병렬로 실행하는 것을 의미합니까? "제대로 작동하지 않았다"는 것을 어떻게 알 수 있습니까? 언제 제대로 작동하는지 어떻게 알 수 있습니까? 다음 그룹을 실행하기 전에 첫 번째 그룹이 완료 될 때까지 기다리시겠습니까?
RobertL

@RobertL. 예, 동시에 병렬 의미합니다. 스크립트가 오류 메시지와 함께 종료됩니다. 예, 다음 그룹을 실행하기 전에 firdst 그룹이 완료 될 때까지 기다려야합니다.

1
@goro가 인용하면 스크립트가 오류 메시지와 함께 종료됩니다. 질문을 편집하여 그러한 메시지를 추가하고 (완료를 위해) 잡담을 제거하십시오 (고맙습니다).
dave_alcarin

각 인스턴스에서 동일한 명령을 실행합니까? 같은 이름?
RobertL

1
@goro, 이것이 정확합니까? "여러 그룹의 명령이 있습니다. 각 그룹 내에서 동시에 명령을 실행해야합니다. 다음 그룹을 시작하기 전에 한 그룹이 완료 될 때까지 그룹을 순차적으로 실행해야합니다."
RobertL

답변:


20

각 그룹 내의 명령은 병렬로 실행되고 그룹은 순차적으로 실행되며 각 병렬 명령 그룹은 실행을 시작하기 전에 이전 그룹이 완료되기를 기다립니다.

다음은 실제 예입니다.

아래 코드와 같이 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
$   

그래도 컬리는 당신의 예에서 완전히 의미가 없다고 생각합니다. 대기는 프로세스 전체이므로이 그룹에서는 컬링 된 그룹이 새 분기를 만들지 않습니다.
PSkocik

1
@PSkocik, 맞습니다. 전정 기관.
RobertL

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

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


2
원래 질문은 "3 개의 명령을 모두 함께 실행"만했다. 명확하지 않으면 두 대답 모두 정확합니다. 에 좋은 전화 wait.
RobertL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.