비동기 서브셸 종료를 처리하는 방법

비동기 서브셸 종료를 처리하는 방법

내가 이것을 가지고 있다고 가정 해 봅시다 :

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 waitbash

관련 정보