내장된 Wait의 예기치 않은 동작이 발생했습니다.
~
❯ sleep 1 &
[1] 72009
~
❯
[1] + 72009 done sleep 1
~
❯ wait 72009
~
❯ echo $?
0
PID가 더 이상 존재하지 않더라도 대기는 여전히 0 종료 상태로 종료됩니다.
질문
- 이 행동의 이유는 무엇입니까?
- 대기는 어떻게 진행되나요? 뒤에서는 무엇을 하고 있나요?
답변1
이 경우 Bash는 wait
프로세스 72009가 하위 프로세스 중 하나임을 "기억"하고 하위 프로세스의 종료 코드인 0을 기억하기 때문에 0을 반환합니다. (문서에는 "활성" 프로세스가 명시적으로 언급되어 있기 때문에 약간 오해의 소지가 있습니다.)
뒤에서는 wait
주어진 프로세스 식별자가 셸의 하위 프로세스(아마도 작업 내) 중 하나에 해당하는지 확인합니다. 그렇다면 해당 프로세스가 아직 실행 중인지 확인합니다. 아직 실행 중이면 완료될 때까지 기다립니다. 완료되면 적절한 종료 코드(프로세스에만 적용되거나 전체 작업에 적용될 수 있음)를 결정하고 해당 종료 코드를 반환합니다. 신호 처리, 프로세스 대체, 터미널 제어 등을 적절하게 처리하는 데에는 추가적인 복잡성이 많이 있지만 여기서는 관련이 없습니다.
종료 코드는 (적어도) 작업 시트에 기억됩니다. 서로 다른 종료 코드( false &
및 true &
)를 사용하여 두 명령을 실행하고 해당 프로세스 식별자를 기다리면 이것이 실제로 어떻게 보이는지 확인할 수 있습니다 . 작업 목록이 지워지지 않는 한 wait
올바른 종료 코드가 제공됩니다. wait
작업 테이블에서 완료된 작업을 제거하기 위해 인수 없이 실행 하면 이전 작업의 종료 코드를 더 이상 검색할 수 없음을 알 수 있습니다.
답변2
이것이 wait
쉘에서 내장 함수가 정의되는 방식입니다.
- 종료된 하위 프로세스를 기다리면
wait
0이 반환됩니다.
일부 셸(예: ksh93
)에는 마지막 몇 개의 프로세스에 대한 캐시가 있으며 이러한 하위 프로세스에 대한 종료 코드를 반환할 수 있습니다.