쉘 스크립트는 백그라운드 명령을 기다립니다.

쉘 스크립트는 백그라운드 명령을 기다립니다.

스크립트를 작성하고 있는데 뭔가 필요한데 방법을 찾을 수 없습니다...

백그라운드 "command1 &"에서 명령을 생성해야 하고, 명령2를 실행하기 전에 스크립트 어딘가에서 명령이 완료될 때까지 기다려야 합니다. 기본적으로 다음이 필요합니다.

참고: 각 명령은 특정 디렉터리에서 실행됩니다! while 루프가 끝나면 내 command1은 각각 특정 프로세스를 실행하는 4개의 디렉터리를 생성하므로 실행되는 총 프로세스 수는 4개입니다.

a=1

while [$a -lt 4 ]

     . command1
   #Generates 1 Process  

     a= `export $a +1`
done

   #Wait until the 4 process end and then run the command2 

    . command2

pid 프로세스 번호가 포함된 명령 에 대한 내용을 본 적이 있지만 wait그것도 작동하지 않습니다.

답변1

wait PID이 명령을 사용하여 프로세스가 끝날 때까지 기다릴 수 있습니다 .

다음을 사용하여 마지막 명령의 PID를 검색할 수도 있습니다.$!

귀하의 경우에는 다음과 같이 작동합니다.

command1 & #run command1 in background
PID=$! #catch the last PID, here from command1
command2 #run command2 while command1 is running in background
wait $PID #wait for command1, in background, to end
command3 #execute once command1 ended

편집 후에는 여러 PID가 있고 이를 알고 있으므로 다음을 수행할 수 있습니다.

command1 & #run command1 in background
PID1=xxxxx
PID2=yyyyy
PID3=xxyyy
PID4=yyxxx
command2 #run command2 while command1 is running in background
wait $PID1 $PID2 $PID3 $PID4 #wait for the four processes of command1, in background, to end
command3 #execute once command1 ended

답변2

가장 깨끗한 방법은 comamnd1시작된 프로세스의 PID를 반환하고 wait@LaurentC가 제안한 대로 각 프로세스에서 사용하는 것입니다.답변.

또 다른 방법은 다음과 같습니다.

## Create a log file
logfile=$(mktemp)

## Run your command and have it print into the log file
## when it's finsihed.
command1 && echo 1 > $logfile &

## Wait for it. The [ ! -s $logfile ] is true while the file is 
## empty. The -s means "check that the file is NOT empty" so ! -s
## means the opposite, check that the file IS empty. So, since
## the command above will print into the file as soon as it's finished
## this loop will run as long as  the previous command si runnning.
while [ ! -s $logfile ]; do sleep 1; done

## continue
command2

답변3

다음 접근 방식을 사용하는 경우 while 루프 뒤에 특별한 "모든 프로세스 대기"가 필요하지 않을 수 있습니다. 루프는 현재 루프가 command1완료될 때까지 기다린 후 다시 맨 위로 루프를 돌립니다. 어떤 조언이라도 주의 깊게 다루시기 바랍니다. 내가 한 유일한 일은 & wait $!당신의 command1.

a=1
while [$a -lt 4 ]
     . command1  & wait $!
   #Generates 1 Process  
     a= `export $a +1`
done

관련 정보