기다려, 기다리지 마

기다려, 기다리지 마

myprogram포함된 파일이 있는 경우

sleep 200
date

백그라운드에서 다음 명령을 실행합니다.

$ sh myprogram &

myprogram명령 사용이 언제 완료되는지 알고 싶습니다.wait

$ cat >notify
wait PID
echo "Program completed"
$ sh notify &

PID세 번째 명령에서 제공한 프로세스 ID입니다. 제 질문은 "Program Complete" 메시지가 마지막 명령 직후 터미널에 인쇄된다는 것입니다. 왜 wait가 기다리지 않습니까? , 우분투 11.10을 사용하고 있습니다

답변1

부모-자식 관계는 관련된 모든 "&"로 인해 망가집니다.

내장 함수는 분명히 호출 프로세스의 직접 하위 PID에서만 작동하는 이 wait(2)시스템 호출을 기반으로 합니다 .waitwait(2)

을 호출하면 대화형 셸의 하위로 실행됩니다 sh myprogram &.sh

호출하면 대화형 셸의 하위 항목이 됩니다 sh notify &.sh

따라서 두 번째 항목은 sh첫 번째 항목과 직접적인 상위 관계가 없으며 작동하지 않습니다 sh.wait

sh myprogram &; sh notify;wait명령은 대화형 셸의 하위 항목에 의해 호출되므로 이들 중 하나를 호출하는 경우에도 작동하지 않습니다 .

나에게 효과가 있었던 방법: sh myprogram &; waitwait명령을 사용하면 대화형 셸( sh명시적으로 호출된 상위 셸) sh이 종료될 때까지 정지됩니다.

답변2

wait이 특정 예에서는 Bruce의 답변에서 알 수 있듯이 기본 셸에서 실행하는 것이 더 좋지만 이를 수행할 수 없는 대체 상황이 있는 경우(예: myprogram포그라운드 프로세스로 실행 해야 하는 경우) 또는 만약 그렇다면 터미널을 제어하는 ​​데몬이 없습니다. 제가 작성한 프로그램을 사용할 수 있습니다기다리다모든 프로세스가 완료될 때까지 기다립니다. 이 예제에서 사용하려면 실행 후

$ sh myprogram

myprogram다음 을 사용하는 notify대신 프로세스 ID를 어떻게든 얻을 수 있습니다 .wait

pwait PID

pwait현재 내 버전은 Linux 전용입니다. FreeBSD를 실행하고 있다면,그들만의 깨달음표준 유틸리티로 작동하는 것 같습니다. 또한 ps아래와 같이 명령이 완료되었는지 다시 확인하는 데 사용할 수도 있습니다.이 쉘 스크립트(해당되는 경우 명령의 종료 코드를 알려주지는 않지만)

관련 정보