Bash 병렬 실행 및 종료 코드

Dec 31 2020

bash 스크립트에서 여러 명령을 병렬로 실행하고 싶지만 이러한 명령 중 하나라도 실패하면 (0이 아닌 종료 코드가 반환 됨) 스크립트 종료 코드가 0이 아니어야합니다.

나는 sem(https://www.gnu.org/software/parallel/sem.html) :

cat >script.sh <<EOF
sem -j+0 "sleep 2; echo 1"
sem -j+0 "sleep 4; exit 1; echo 2"
sem -j+0 "sleep 6; echo 3"
sem --wait
EOF
bash script.sh; echo $?

프로세스를 배경으로 :

cat >script.sh <<EOF
{sleep 2; echo 1} &
{sleep 4; exit 1; echo 2} &
{sleep 6; echo 3} &
wait
EOF
bash script.sh; echo $?

두 경우 모두 전체 종료 코드는 항상 0입니다.

어떤 아이디어?

답변

2 KamilCuk Dec 31 2020 at 02:56

그러나 이러한 명령 중 하나라도 실패하면 (0이 아닌 종료 코드를 반환) 스크립트 종료 코드는 0이 아니어야합니다.

따라서 그 조건을 작성하십시오.

childs=();
{ sleep 0.2; echo 1 ;} &
childs+=($!); { sleep 0.4; exit 1; echo 2; } & childs+=($!);
{ sleep 0.6; echo 3; } &
childs+=($!); ret=0; for i in "${childs[@]}"; do
     if ! wait "$i"; then ret=1; fi done echo "ret=$ret"
exit "$ret"
2 yellowhat Dec 31 2020 at 15:23

답변 해 주신 모든 분들께 감사드립니다.

Mark Setchell제안에 따라 나에게 가장 적합한 솔루션은 다음과 같습니다.

#!/bin/bash
set -euo pipefail

cat <<EOF | parallel --halt 1
date; sleep 2; date; echo -e "1\n"
date; sleep 4; exit 1; date; echo -e "2\n"
date; sleep 6; date; echo -e "3\n"
EOF