저는 Linux를 처음 접했기 때문에 올바른 용어를 사용하지 않았다면 사과드립니다.
여러 작업을 병렬로 실행하려고 합니다(백그라운드 셸 연산자 사용). 그러나 먼저 두 작업을 병렬로 실행한 다음 (완료 후에만) 처음 두 작업의 결과에 따라 나머지 작업을 실행해야 합니다.
예를 들어, 작업 A.1
및 가 A.2
병렬로 실행될 수 있고(그들 사이에 종속성 없음) 작업 및 에서 사용할 일부 파일을 생성할 수 있다고 B.1
가정 B.2
합니다 B.3
. 모든 B
작업은 독립적이지만 파일을 보기 전에는 시작 A.1
하거나 완료할 수 없습니다. A.2
이를 염두에 두고 다음과 같은 쉘 스크립트를 생각해 냈습니다.
script1
다음 줄이 있습니다.
./A.1 &
./A.2 &
script2
다음 줄이 있습니다.
./B.1 &
./B.2 &
./B.3 &
script3
다음과 같이 스크립트 1과 2를 순서대로(즉, &
연산자를 사용하지 않고) 호출하면 됩니다.
./script1
./script2
script3
내가 찾고 있는 것이 맞는지 잘 모르겠습니다 . 내가 옳은 일을 하고 있는 걸까? 즉, 완료될 script2
때까지 기다렸다가 시작하시겠습니까?script1
답변1
아니요, 원하는 효과를 얻을 수 없습니다. 하지만 실제로는 그보다 더 간단합니다.
첫째, 간단한 수준에서는 귀하의 분석이 정확합니다. script3
만약
./script1
./script2
그렇다면, 완료될 때 script3
까지 기다린 script1
후 시작하겠습니다 script2
. 문제는 script1
기본적으로 즉시 "완료"된다는 것입니다. 즉, 두 개의 프로세스를 생성하는 데 걸리는 시간이므로 명령이 계속 실행되는 동안 명령 A
이 시작됩니다 . 당신이 원하는 것이 아닙니다.B
A
해결책은
./A.1 &
./A.2 &
wait
./B.1 &
./B.2 &
./B.3 &
이 wait
명령(이름에서 알 수 있듯이)은 계속하기 전에 기존 비동기 프로세스가 종료될 때까지 기다립니다.
이 wait
명령은 프로세스를 생성한 동일한 쉘에서 실행되어야 합니다 A
. 6개 명령을 모두 하나의 스크립트에 넣거나, 처음 3개 명령을 하나의 스크립트에 넣거나, 마지막 3개 명령을 다른 스크립트에 넣거나, 기타 다양한 조합을 넣을 수 있습니다.
또한 명령 다음에 작업을 wait
수행 할 수도 있습니다.B