मैं एक निर्देशिका पर PNG छवियों का एक गुच्छा है। मेरे पास एक एप्लिकेशन है जिसे pngout कहा जाता है जिसे मैं इन चित्रों को संपीड़ित करने के लिए चलाता हूं। इस एप्लिकेशन को एक स्क्रिप्ट द्वारा बुलाया जाता है। समस्या यह है कि यह स्क्रिप्ट एक समय में एक करता है, कुछ इस तरह से:
FILES=(./*.png)
for f in "${FILES[@]}"
do
echo "Processing $f file..."
# take action on each file. $f store current file name
./pngout -s0 $f R${f/\.\//}
done
एक समय में सिर्फ एक फ़ाइल को संसाधित करने में बहुत समय लगता है। इस ऐप को चलाने के बाद, मैं देखता हूं कि सीपीयू सिर्फ 10% है। इसलिए मुझे पता चला कि मैं इन फ़ाइलों को 4 बैचों में विभाजित कर सकता हूं, प्रत्येक बैच को एक निर्देशिका में रख सकता हूं और 4 को चार टर्मिनल विंडो, चार प्रक्रियाओं से फायर कर सकता हूं, इसलिए मेरी स्क्रिप्ट के चार उदाहरण हैं, एक ही समय में, उन छवियों को संसाधित करना और नौकरी में 1/4 समय लगता है।
दूसरी समस्या यह है कि मैंने छवियों और बैचों को विभाजित करने और चार निर्देशिकाओं को स्क्रिप्ट की प्रतिलिपि बनाने में समय खो दिया, 4 टर्मिनल विंडो खोलें, ब्ला ब्ला ...
कैसे एक स्क्रिप्ट के साथ, कुछ भी विभाजित किए बिना?
मेरा मतलब दो चीजों से है: पहले मैं एक बैश स्क्रिप्ट से कैसे करूँ, पृष्ठभूमि के लिए एक प्रक्रिया आग? (बस जोड़ें और अंत तक?) दूसरा: मैं चौथे कार्यों को भेजने के बाद पृष्ठभूमि पर कार्य भेजना कैसे बंद कर दूं और कार्य समाप्त होने तक प्रतीक्षा करने के लिए स्क्रिप्ट डालूं? मेरा मतलब है, बस एक कार्य को पृष्ठभूमि में एक कार्य के रूप में भेजना, हमेशा 4 कार्यों को समानांतर में रखना? अगर मैं यह नहीं करता कि पाश पृष्ठभूमि के कार्यों के zillions को आग लगा देगा और CPU बंद हो जाएगा।