बैश समानांतर निष्पादन और निकास कोड

Dec 31 2020

मैं कई कमांड को बैश स्क्रिप्ट में समानांतर में चलाना चाहूंगा, लेकिन अगर इनमें से कोई भी कमांड विफल हो जाती है (एक गैर-शून्य निकास कोड लौटाता है), तो स्क्रिप्ट निकास कोड गैर-शून्य होना चाहिए।

मैंने उपयोग करने की कोशिश की है 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

लेकिन अगर इनमें से कोई भी आदेश विफल हो जाता है (एक गैर-शून्य निकास कोड लौटाता है), तो स्क्रिप्ट निकास कोड गैर-शून्य होना चाहिए।

इसलिए वह शर्त लिखें।

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