मैं wait
का उपयोग कर पसंद नहीं है, क्योंकि यह प्रक्रिया बाहर निकलता है, जो आदर्श नहीं है जब वहाँ के रूप में मैं कर सकते हैं 'पर प्रतीक्षा करने के लिए एक से अधिक प्रक्रिया कर रहे हैं जब तक अवरुद्ध हो जाता है वर्तमान प्रक्रिया पूरी होने तक स्थिति अद्यतन प्राप्त नहीं करें। मैं kill -0
और sleep
के संयोजन का उपयोग करना पसंद करता हूं।
प्रतीक्षा करने के लिए pids
की एक सरणी को देखते हुए, मैं नीचे दिए गए waitPids()
फ़ंक्शन का उपयोग करता हूं ताकि पीआईडी अभी भी समाप्त होने के लिए लंबित हो।
declare -a pids
waitPids() {
while [ ${#pids[@]} -ne 0 ]; do
echo "Waiting for pids: ${pids[@]}"
local range=$(eval echo {0..$((${#pids[@]}-1))})
local i
for i in $range; do
if ! kill -0 ${pids[$i]} 2> /dev/null; then
echo "Done -- ${pids[$i]}"
unset pids[$i]
fi
done
pids=("${pids[@]}") # Expunge nulls created by unset.
sleep 1
done
echo "Done!"
}
जब मैं पृष्ठभूमि में एक प्रक्रिया शुरू, मैं अपने पीआईडी तुरंत pids
सरणी के लिए उपयोगिता समारोह नीचे इस का उपयोग करके जोड़ें:
addPid() {
desc=$1
pid=$2
echo "$desc -- $pid"
pids=(${pids[@]} $pid)
}
यहां एक नमूना दिखाता है कि कैसे उपयोग करने के लिए है:
for i in {2..5}; do
sleep $i &
addPid "Sleep for $i" $!
done
waitPids
और यहाँ कैसे प्रतिक्रिया दिखाई देता है:
Sleep for 2 -- 36271
Sleep for 3 -- 36272
Sleep for 4 -- 36273
Sleep for 5 -- 36274
Waiting for pids: 36271 36272 36273 36274
Waiting for pids: 36271 36272 36273 36274
Waiting for pids: 36271 36272 36273 36274
Done -- 36271
Waiting for pids: 36272 36273 36274
Done -- 36272
Waiting for pids: 36273 36274
Done -- 36273
Waiting for pids: 36274
Done -- 36274
Done!
आप miscapitalized गए do_something ... नाम ;-) –
मिल गया - क्या बारे में जब मुझे यकीन है कि मैं केवल हूँ बनाना चाहते एक समय में 50 उदाहरण चल रहे हैं? और - जब उन प्रक्रियाओं में से एक किया जाता है, तो सुनिश्चित करें कि 1 और उत्पन्न हो गया है। – Greg
'जॉब्स' बैश बिल्टिन का उपयोग करें। –