शेल स्क्रिप्ट में एक साथ दो या अधिक कमांड निष्पादित करें

Nov 28 2020

शेल स्क्रिप्ट में समानांतर रूप से कमांड चलाना बहुत उपयोगी है, लेकिन मैं इसे करने के तरीके नहीं खोज सकता। क्या यह संभव है? यदि हां, तो मैं इसे कैसे प्राप्त करूंगा? मैं मुख्य रूप से ऐसा करने में दिलचस्पी रखता हूं fish

यह तब उपयोगी होता है जब मैं ऐसी कमांड चला रहा होता हूं, जिसे पूरा होने में लंबा समय लगता है, लेकिन हर चीज को पूरा करने में लगने वाले समय को कम करने के लिए एक ही समय पर चलाने की आवश्यकता हो सकती है।

जवाब

5 KamilMaciorowski Nov 28 2020 at 16:03

सबसे बुनियादी दृष्टिकोण के साथ है &, यह अन्य उत्तर सही है। यह वकालत भी करता है nohupलेकिन nohupस्टड, स्टडआउट और स्टडर को पुनर्निर्देशित करता है, कुछ ऐसा जो आप कर सकते हैं या नहीं कर सकते हैं। के बीच अंतरnohupdisown& पढ़ें , और एक शिक्षित निर्णय लें।

एक और दृष्टिकोण है parallelयह उपयोगी होगा यदि आप जिस कमांड को समानांतर बनाना चाहते हैं वह एक दूसरे के समान है और आप एक पैटर्न को क्राफ्ट कर सकते हैं।

उपकरण का मूल संस्करण ( moreutilsकम से कम , डेबियन में ) आपको एक ही समय में चलने वाली नौकरियों की संख्या को सीमित करने की अनुमति देता है। GNUparallel अधिक उन्नत है। यदि आप जेनरेट आउटपुट चलाना चाहते हैं तो निम्नलिखित विकल्प विशेष रूप से उपयोगी होंगे:

--group
समूह उत्पादन। प्रत्येक कार्य का आउटपुट एक साथ समूहीकृत किया जाता है और केवल तभी प्रिंट किया जाता है जब कमांड समाप्त हो जाती है। Stdout (मानक आउटपुट) पहले stderr (मानक त्रुटि) के बाद आता है। […]

( स्रोत )

( --groupडिफ़ॉल्ट रूप से सक्षम है, इसलिए आमतौर पर आपको इसे स्पष्ट रूप से उपयोग करने की आवश्यकता नहीं है।)

--keep-order
-k
आउटपुट का क्रम इनपुट के क्रम के समान रखें। नौकरी पूरा होते ही आम तौर पर नौकरी का आउटपुट छप जाएगा। […] -kकेवल उस क्रम को प्रभावित करता है जिसमें आउटपुट मुद्रित होता है - उस क्रम में नहीं, जिसमें नौकरी चलती है।

( स्रोत )

उनके साथ कई नौकरियों से उत्पादन का आयोजन किया जाएगा, कुछ आप से नहीं मिल सकता है &। कभी-कभी आप आउटपुट के बारे में परवाह नहीं करते हैं लेकिन फिर भी अनुक्रम के बारे में परवाह करते हैं; जैसे मेरा यह उत्तर जहाँ GNU parallelका उपयोग कई curlप्रक्रियाओं को समानांतर करने और अनुक्रम को बनाए रखते हुए प्रत्येक से बाहर निकलने की स्थिति प्राप्त करने के लिए किया जाता है ।

डेबियन GNU parallelमें एक पैकेज में है parallel। एक अलग निष्पादन योग्य के रूप में parallelकिसी भी शेल से चलाया जा सकता है।

2 Giacomo1968 Nov 28 2020 at 11:12

ऐसा करने का सबसे अच्छा तरीका nohupकमांड &के अंत में संलग्न किए गए कमांड के साथ कमांड को जोड़ना है

अस्पष्ट है कि आपका मूल लक्ष्य क्या है, लेकिन मुझे उम्मीद है कि मदद मिलेगी!

लिनक्स मशीन पर पृष्ठभूमि प्रक्रिया के रूप में किसी भी कमांड को चलाने के लिए, आपको कमांड को पहले से तैयार करना चाहिए nohupऔर &अंत तक जोड़ना चाहिए ।

तो अंतिम आदेश होगा:

nohup [your command] &

इसका nohupमतलब है कि कमांड को "हैंग अप्स" को नजरअंदाज करना चाहिए और इसमें &जोड़ा गया एम्पर्सैंड एक शेल कमांड है जो सिस्टम को बैकग्राउंड प्रोसेस के रूप में चलाने के लिए कहता है। इसके उपयोग के बारे में अधिक जानकारी यहां पाई जा सकती है ।

जब आप इस तरह एक कमांड चलाते हैं, तो प्रक्रिया चलेगी, आपको कमांड प्रॉम्प्ट पर वापस भेजा जाएगा और आप टर्मिनल सत्र से बाहर निकल सकते हैं या उस टर्मिनल सत्र के दौरान उस कमांड से संबंधित कुछ और भी कर सकते हैं।