बैश समानांतर निष्पादन और निकास कोड
मैं कई कमांड को बैश स्क्रिप्ट में समानांतर में चलाना चाहूंगा, लेकिन अगर इनमें से कोई भी कमांड विफल हो जाती है (एक गैर-शून्य निकास कोड लौटाता है), तो स्क्रिप्ट निकास कोड गैर-शून्य होना चाहिए।
मैंने उपयोग करने की कोशिश की है 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
लेकिन अगर इनमें से कोई भी आदेश विफल हो जाता है (एक गैर-शून्य निकास कोड लौटाता है), तो स्क्रिप्ट निकास कोड गैर-शून्य होना चाहिए।
इसलिए वह शर्त लिखें।
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
सभी को उनके जवाब के लिए धन्यवाद।
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