스크립트를 작성하고 있지만 수행 할 방법을 찾을 수없는 필요한 것이 있습니다.
백그라운드에서 “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 프로세스 번호를 사용했지만 작동하지 않았습니다.
코멘트
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
command1
? 4 개 프로세스의 PID를 반환하도록 수정할 수 있습니까?$!
변수를 사용하여이를 가져올 수 있으며 여기에서 보여준대로wait
명령에 전달할 수 있습니다.$!
에는 마지막 백그라운드 PID가 포함되고$$
에는 마지막 프로세스 실행 '의 PID가 포함됩니다. .