एक पृष्ठभूमि वाले बच्चे की प्रक्रिया की पिड $ में संग्रहित है ! । आप सभी बच्चों की प्रक्रियाओं को एक सरणी, उदाहरण के लिए PIDS [] में स्टोर कर सकते हैं ।
wait [-n] [jobspec or pid …]
प्रतीक्षा करें जब तक कि प्रत्येक प्रक्रिया आईडी पिड या जॉब स्पेसिफिकेशन जॉबस्पेक द्वारा निर्दिष्ट बच्चे की प्रक्रिया समाप्त न हो जाए और अंतिम कमांड के एक्जिट स्टेटस का इंतजार करें। यदि नौकरी की युक्ति दी जाती है, तो नौकरी में सभी प्रक्रियाओं का इंतजार किया जाता है। यदि कोई तर्क नहीं दिया जाता है, तो वर्तमान में सभी सक्रिय बाल प्रक्रियाओं का इंतजार किया जाता है, और वापसी की स्थिति शून्य है। यदि एक विकल्प की आपूर्ति की जाती है, तो किसी भी नौकरी को समाप्त करने के लिए प्रतीक्षा करें और अपनी निकास स्थिति लौटाएं। यदि न तो जॉबस्पेक और न ही पीआईडी शेल की सक्रिय बाल प्रक्रिया को निर्दिष्ट करता है, तो वापसी की स्थिति 127 है।
प्रतीक्षा आदेश का उपयोग करें आप सभी बाल प्रक्रियाओं को समाप्त करने के लिए इंतजार कर सकते हैं, इस बीच आप $ के माध्यम से प्रत्येक बच्चे की प्रक्रियाओं की निकास स्थिति प्राप्त कर सकते हैं ? और स्थिति में स्टोर की स्थिति [] । फिर आप स्टेटस के आधार पर कुछ कर सकते हैं।
मैंने निम्नलिखित 2 समाधानों की कोशिश की है और वे अच्छी तरह से चलते हैं। solution01 अधिक संक्षिप्त है, जबकि solution02 थोड़ा जटिल है।
solution01
#!/bin/bash
# start 3 child processes concurrently, and store each pid into array PIDS[].
process=(a.sh b.sh c.sh)
for app in ${process[@]}; do
./${app} &
PIDS+=($!)
done
# wait for all processes to finish, and store each process's exit code into array STATUS[].
for pid in ${PIDS[@]}; do
echo "pid=${pid}"
wait ${pid}
STATUS+=($?)
done
# after all processed finish, check their exit codes in STATUS[].
i=0
for st in ${STATUS[@]}; do
if [[ ${st} -ne 0 ]]; then
echo "$i failed"
else
echo "$i finish"
fi
((i+=1))
done
solution02
#!/bin/bash
# start 3 child processes concurrently, and store each pid into array PIDS[].
i=0
process=(a.sh b.sh c.sh)
for app in ${process[@]}; do
./${app} &
pid=$!
PIDS[$i]=${pid}
((i+=1))
done
# wait for all processes to finish, and store each process's exit code into array STATUS[].
i=0
for pid in ${PIDS[@]}; do
echo "pid=${pid}"
wait ${pid}
STATUS[$i]=$?
((i+=1))
done
# after all processed finish, check their exit codes in STATUS[].
i=0
for st in ${STATUS[@]}; do
if [[ ${st} -ne 0 ]]; then
echo "$i failed"
else
echo "$i finish"
fi
((i+=1))
done