서브셸을 병렬로 실행하고 종료 코드를 수집합니다.

서브셸을 병렬로 실행하고 종료 코드를 수집합니다.

나는 다음을 가지고 있습니다. 서브 쉘을 병렬로 실행한다고 생각하지만 실제로는 직렬로 실행하는 것 같고 그 이유를 이해할 수 없습니다.

#!/usr/bin/env bash

set -e;
set -m # allow for job control


EXIT_CODE=0;  # exit code of overall script

function handleJobs() {
     for job in `jobs -p`; do
         echo "PID => ${job}"
         CODE=0;
         wait ${job} || CODE=$?
         if [[ "${CODE}" != "0" ]]; then
            echo "At least one process failed with exit code => ${CODE}" ;
            EXIT_CODE=1;
         fi
     done
}

trap 'handleJobs' CHLD


for file in "$HOME/mongodump_dev/cdt_db/"* ; do

  file="$(basename "$file")"

  if [[ "$file" != "system"* && "$file" != "locks"* ]]; then

    mongorestore \
        --db "cdt_dev" \
        --collection "${file%.*}" \
        --host "<my-host>" \
        "$HOME/mongodump_dev/cdt_db/$file"  &

  fi;

done


wait;
echo "exit code => $EXIT_CODE"
exit "$EXIT_CODE"

서브쉘이 직렬로 실행되는 이유를 아는 사람이 있습니까?

나는 이것을 시도한다:

(
        mongorestore \
            --db "cdt_dev" \
            --collection "${file%.*}" \
            --host "<my-host>" \
            "$HOME/mongodump_dev/cdt_db/$file"  &

) &

이제는 병렬로 실행되지만 이제 전체 스크립트가 종료되지 않으며 실제로 종료 코드를 정확하게 캡처하지 못하는 것이 걱정됩니다.

답변1

귀하가 작성한 스크립트에는 많은 "문제"가 있습니다. 제가 한 일은 스크립트를 복사한 다음 테스트 및 평가 목적으로 로그 파일에 추가된 추적 메시지를 mongorestore대체 sleep 9999하고 삽입하는 등의 작업을 수행하여 스크립트를 단순화하는 것이었습니다. echo대체로 당신이 필요하지 않은 것 같습니다어느알겠습니다. mongorestore선언을 다음으로 바꾸세요.

( mongorestore ...
  exit_code=$?
  [ $exit_code -ne 0 ] \
  && printf "Process %s for file %s failed with exit code %s\n" \
       $BASHPID  "${file%.*}" $exit_code
) &

그런데 모든 하위 프로세스가 병렬로 생성되었는지 확인하는 쉬운 방법은 다른 터미널을 열고 pgrep -a mongorestore.

또한 스크립트 끝에 EXIT_CODE를 사용하면 값이 없어야 하므로 명령이 exit일종의 오류와 함께 실패해야 하며 이는 스크립트가 항상 오류와 함께 종료된다는 것을 의미합니다.

관련 정보