나는 다음을 가지고 있습니다. 서브 쉘을 병렬로 실행한다고 생각하지만 실제로는 직렬로 실행하는 것 같고 그 이유를 이해할 수 없습니다.
#!/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
일종의 오류와 함께 실패해야 하며 이는 스크립트가 항상 오류와 함께 종료된다는 것을 의미합니다.