내가 이것을 가지고 있다고 가정 해 봅시다 :
set -e;
(
docker stop notifier-server
docker rm -f notifier-server
exit 1 # explicitly exit with non-zero
) &
wait;
echo 'we are here now'
서브쉘이 0이 아닌 값으로 종료되더라도 항상 에코 라인에 도달합니까? 백엔드 프로세스/하위 쉘이기 때문에 그렇습니다.
이 문제를 보는 올바른 방법은 무엇입니까?
답변1
프로세스가 백그라운드 프로세스인지 여부와는 아무런 관련이 없으며 wait
명령의 종료 상태와 관련이 있습니다.
에서 help wait
:
ID가 제공되지 않으면 현재 활성화된 모든 하위 프로세스가 대기되고 상태 0이 반환됩니다.
$ bash -exc '(sleep 1; exit 1) & wait ; echo done'
+ wait
+ sleep 1
+ exit 1
+ echo done
done
-n 옵션이 제공되면 다음 작업이 종료될 때까지 기다리고 종료 상태를 반환합니다.
$ bash -exc '(sleep 1; exit 1) & wait -n; echo $?:done'
+ wait -n
+ sleep 1
+ exit 1
답변2
귀하의 코드는 현재 쉘 세션을 종료하지 않습니다.0이 아닌 종료 상태가 반환되지 않았습니다.. 백그라운드 작업을 시작하는 호출 셸의 결과는 항상 0입니다.
wait "$!"
또는 ("다음 작업이 완료될 때까지 대기") 를 사용한 경우 wait -n
쉘 세션회의wait
기다리고 있던 작업의 0이 아닌 종료 상태가 반환되므로 중단되었습니다 .
에서 확인 help wait
됨bash