একটি পটভূমি শিশু প্রক্রিয়া এর পিড stored মধ্যে সংরক্ষণ করা হয় ! । আপনি সমস্ত শিশু প্রসেসের পিডগুলিকে একটি অ্যারেতে রাখতে পারেন, যেমন পিআইডিএস [] ।
wait [-n] [jobspec or pid …]
প্রতিটি প্রক্রিয়া আইডি পিড বা জব স্পেসিফিকেশন জবস্পেক প্রস্থান করে নির্দিষ্ট শিশু প্রক্রিয়াটি না হওয়া পর্যন্ত অপেক্ষা করুন এবং অপেক্ষা করা শেষ কমান্ডের প্রস্থান স্থিতি ফিরে আসুন। যদি কোনও কাজের বৈশিষ্ট্য দেওয়া হয়, তবে কাজের সমস্ত প্রক্রিয়াগুলির জন্য অপেক্ষা করা হয়। যদি কোনও যুক্তি না দেওয়া হয় তবে বর্তমানে সমস্ত সক্রিয় শিশু প্রক্রিয়াগুলির জন্য অপেক্ষা করা হচ্ছে, এবং প্রত্যাবর্তনের অবস্থা শূন্য। যদি -n বিকল্প সরবরাহ করা হয়, অপেক্ষা করুন কোনও কাজ শেষ হওয়ার জন্য অপেক্ষা করে এবং তার প্রস্থান স্থিতি ফিরে আসে। যদি জবস্পেক বা পিড উভয়ই শেলের একটি সক্রিয় শিশু প্রক্রিয়া নির্দিষ্ট করে না, তবে রিটার্নের স্থিতি 127।
আপনি সমস্ত শিশু প্রক্রিয়া শেষ হওয়ার জন্য অপেক্ষা করতে পারেন অপেক্ষার কমান্ডটি ব্যবহার করুন , ইতিমধ্যে আপনি via এর মাধ্যমে প্রতিটি শিশু প্রসেসের প্রস্থান স্থিতি পেতে পারেন ? এবং স্ট্যাটাসে স্টোর স্থিতি [] । তারপরে আপনি স্ট্যাটাসের উপর নির্ভর করে কিছু করতে পারেন।
আমি নিম্নলিখিত 2 সমাধানগুলি চেষ্টা করেছি এবং সেগুলি ভালভাবে চালিত হয়। সমাধান 01 আরও সংক্ষিপ্ত, যখন সমাধান 02 কিছুটা জটিল।
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