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