병렬로 실행되는 서브셸에서 종료 코드 가져오기

병렬로 실행되는 서브셸에서 종료 코드 가져오기

일련의 장기 실행 프로세스를 시작하기 위한 쉘 스크립트를 만들려고 합니다. 그것들을 a, b, c, d, e라고 부르자. 프로세스 b, c, d는 병렬로 실행되어야 하며, 프로세스 e는 이전 프로세스가 모두 종료된 후에 실행되어야 합니다.성공적으로.

내 (의사) 코드가 있습니다.

{
    echo "starting a"
    a
}&&
{
    (echo "starting b"; b; exit $?)&
    (echo "starting c"; c; exit $?)&
    (echo "starting d"; d; exit $?)&
    wait
}&&
{
    echo "starting e"
    e
}

내 문제는 b, c, d 중 하나라도 실패하면 스크립트가 계속해서 e를 실행한다는 것입니다. 그것을 방지할 수 있는 방법이 있나요?

답변을 보내주셔서 정말 감사드립니다!

앙투안

답변1

{
    (echo "starting b"; b)&
    (echo "starting c"; c)&
    (echo "starting d"; d)&
    wait %1 && wait %2 && wait %3
}&&

특정 작업을 기다릴 때 wait이 작업 종료 코드가 반환됩니다.

이해하려면 다음 두 가지 예를 살펴보십시오.
마지막 줄만 중요합니다( 종료 상태 표시 wait).

(sleep 3; false) & wait; echo $?
[1] 25358
[1]+  Exit 1                  ( sleep 3; false )
0

--

(sleep 3; false) & wait %1; echo $?
[1] 25362
[1]+  Exit 1                  ( sleep 3; false )
1

답변2

백그라운드에서 프로세스를 실행하면 기본적으로 성공이나 실패에 관심이 없다는 것을 쉘에 알릴 수 있습니다.

wait ~ 할 것이다해당되는 경우 종료 코드의 신호 값을 보고합니다. 이것은 당신이 찾고 있는 것이 아닙니다.

해결책은 각 명령이 상태를 stdout에 보고하고 grep을 사용하여 응답을 계산하도록 하는 것입니다.

{
  (echo "starting b"; b && echo ok)&
  (echo "starting c"; c && echo ok)&
  (echo "starting d"; d && echo ok)&
} | 
grep -c ok | ( read n && (( n==3 )) ) && 

{
echo "starting e"; e
}

관련 정보