मेरे पास एक बैश स्क्रिप्ट है जो इस तरह दिखती है:
#!/bin/bash
wget LINK1 >/dev/null 2>&1
wget LINK2 >/dev/null 2>&1
wget LINK3 >/dev/null 2>&1
wget LINK4 >/dev/null 2>&1
# ..
# ..
wget LINK4000 >/dev/null 2>&1
लेकिन प्रत्येक पंक्ति को संसाधित करना जब तक कि कमांड समाप्त नहीं हो जाती है तब अगले एक पर जाना बहुत समय लेने वाला होता है, मैं उदाहरण के लिए 20 लाइनों को एक बार में संसाधित करना चाहता हूं जब वे एक और 20 लाइनें समाप्त हो जाती हैं।
मैंने wget LINK1 >/dev/null 2>&1 &बैकग्राउंड में कमांड भेजने और इसे आगे बढ़ाने के बारे में सोचा , लेकिन यहां 4000 लाइनें हैं इसका मतलब है कि मेरे पास प्रदर्शन के मुद्दे होंगे, यह उल्लेख करने के लिए नहीं कि मुझे एक ही समय में कितनी प्रक्रियाएं शुरू करनी चाहिए, इसलिए यह अच्छा नहीं है विचार।
एक समाधान जो मैं अभी सोच रहा हूं वह यह जांच रहा है कि क्या एक कमांड अभी भी चल रहा है या नहीं, उदाहरण के लिए 20 लाइनों के बाद मैं इस लूप को जोड़ सकता हूं:
while [ $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done
निश्चित रूप से इस मामले में मुझे लाइन के अंत में और जोड़ना होगा! लेकिन मुझे लग रहा है कि यह करने का सही तरीका नहीं है।
इसलिए मैं वास्तव में प्रत्येक 20 लाइनों को एक साथ कैसे समूहित करता हूं और अगली 20 पंक्तियों पर जाने से पहले उनके समाप्त होने की प्रतीक्षा करता हूं, यह स्क्रिप्ट गतिशील रूप से उत्पन्न होती है इसलिए मैं इसे उत्पन्न होने के दौरान इस पर जो भी गणित करना चाहता हूं वह कर सकता हूं, लेकिन यह आवश्यक नहीं है wget का उपयोग करें, यह सिर्फ एक उदाहरण था ताकि कोई भी समाधान जो wget specific हो वह मुझे किसी भी तरह से अच्छा न लगे।
waitयहाँ सही उत्तर है, लेकिन आपकाwhile [ $(ps …बहुत बेहतर लिखा होगाwhile pkill -0 $KEYWORD…- प्रोक्टूल का उपयोग करना ... अर्थात, एक विशिष्ट नाम के साथ एक प्रक्रिया अभी भी चल रही है या नहीं यह जाँचने के लिए वैध कारणों के लिए।