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

스크립트를 작성하고 있지만 수행 할 방법을 찾을 수없는 필요한 것이 있습니다.

백그라운드에서 “command1 &”명령을 작성하고 스크립트의 어딘가에서 command2를 수행하기 전에 완료 될 때까지 기다려야합니다. 기본적으로 , 나는 이것이 필요합니다 :

참고 : 각 명령은 특정 디렉토리에서 실행됩니다! while 루프가 끝날 때 my command1은 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  

wait 명령이 pid 프로세스 번호를 사용했지만 작동하지 않았습니다.

코멘트

  • command1? 4 개 프로세스의 PID를 반환하도록 수정할 수 있습니까?
  • 예! 나는 이미 가지고 있습니다 🙂
  • 그에 따라 내 답변을 업데이트했습니다. 귀하의 예외 사항과 일치하는지 알려주세요.
  • 이 질문은 다음 질문과 관련이 있습니다. unix.stackexchange.com/questions/100801/ … . 유일한 차이점은 백그라운드 프로세스에서 PID를 가져와야한다는 것입니다. $! 변수를 사용하여이를 가져올 수 있으며 여기에서 보여준대로 wait 명령에 전달할 수 있습니다. $!에는 마지막 백그라운드 PID가 포함되고 $$에는 마지막 프로세스 실행 '의 PID가 포함됩니다. .
  • 좋습니다. 이제 스크립트가 전혀 의미가 없습니다. 구문 오류와 이상 함이 도처에 있습니다. 실제 대본을 보여 주시겠습니까? 명령을 소싱하는 이유는 무엇입니까? 그냥 실행하지 않는 이유는 무엇입니까?

Answer

wait PID 프로세스가 끝날 때까지 기다리십시오.

또한 $!

In을 사용하여 마지막 명령의 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 

댓글

  • 수정 한 후 생성 된 PID (xxxxx, yyyyy, xxyyy, yyxxx)를 알고있는 경우 ) 대기 할 PID 목록과 함께 wait를 사용할 수도 있습니다 (man 참조). ' 모르는 경우,이를 command1로 모을 수 있습니다 (command1이란 무엇입니까? 자체 스크립트입니까?)
  • 아마도 ' 애초에 올바르게 그룹화되었습니다. 수행 방법에 대한 아이디어는 내 대답을 참조하십시오.

답변

이 작업을 수행하는 가장 깨끗한 방법 comamnd1가 실행 된 프로세스의 PID를 반환하고 @LaurentC “s 서 제안한대로 각 프로세스에서 wait를 사용하도록하는 것입니다. div id = “9fde441b07″>

answer .

다른 접근 방식은 다음과 같습니다.

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

댓글

  • 죄송하지만 여전히 작동하지 않습니다. 질문을 다시 개선하겠습니다!

답변

다음 방법을 사용하는 경우 while 루프 후에 특별한 “모든 프로세스 대기”가 필요하지 않을 수 있습니다. 루프는 현재 를 완료하려면 맨 위로 돌아 가세요. 조언과 마찬가지로주의를 기울여주세요. 내가 한 유일한 작업은 & wait $!command1.

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

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다