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)
시스템 호출을 기반으로 합니다 .wait
wait(2)
을 호출하면 대화형 셸의 하위로 실행됩니다 sh myprogram &
.sh
호출하면 대화형 셸의 하위 항목이 됩니다 sh notify &
.sh
따라서 두 번째 항목은 sh
첫 번째 항목과 직접적인 상위 관계가 없으며 작동하지 않습니다 sh
.wait
sh myprogram &; sh notify;
이 wait
명령은 대화형 셸의 하위 항목에 의해 호출되므로 이들 중 하나를 호출하는 경우에도 작동하지 않습니다 .
나에게 효과가 있었던 방법: sh myprogram &; wait
이 wait
명령을 사용하면 대화형 셸( sh
명시적으로 호출된 상위 셸) sh
이 종료될 때까지 정지됩니다.
답변2
wait
이 특정 예에서는 Bruce의 답변에서 알 수 있듯이 기본 셸에서 실행하는 것이 더 좋지만 이를 수행할 수 없는 대체 상황이 있는 경우(예: myprogram
포그라운드 프로세스로 실행 해야 하는 경우) 또는 만약 그렇다면 터미널을 제어하는 데몬이 없습니다. 제가 작성한 프로그램을 사용할 수 있습니다기다리다모든 프로세스가 완료될 때까지 기다립니다. 이 예제에서 사용하려면 실행 후
$ sh myprogram
myprogram
다음 을 사용하는 notify
대신 프로세스 ID를 어떻게든 얻을 수 있습니다 .wait
pwait PID
pwait
현재 내 버전은 Linux 전용입니다. FreeBSD를 실행하고 있다면,그들만의 깨달음표준 유틸리티로 작동하는 것 같습니다. 또한 ps
아래와 같이 명령이 완료되었는지 다시 확인하는 데 사용할 수도 있습니다.이 쉘 스크립트(해당되는 경우 명령의 종료 코드를 알려주지는 않지만)