शेल स्क्रिप्ट में एक साथ दो या अधिक कमांड निष्पादित करें
शेल स्क्रिप्ट में समानांतर रूप से कमांड चलाना बहुत उपयोगी है, लेकिन मैं इसे करने के तरीके नहीं खोज सकता। क्या यह संभव है? यदि हां, तो मैं इसे कैसे प्राप्त करूंगा? मैं मुख्य रूप से ऐसा करने में दिलचस्पी रखता हूं fish
।
यह तब उपयोगी होता है जब मैं ऐसी कमांड चला रहा होता हूं, जिसे पूरा होने में लंबा समय लगता है, लेकिन हर चीज को पूरा करने में लगने वाले समय को कम करने के लिए एक ही समय पर चलाने की आवश्यकता हो सकती है।
जवाब
सबसे बुनियादी दृष्टिकोण के साथ है &
, यह अन्य उत्तर सही है। यह वकालत भी करता है nohup
लेकिन nohup
स्टड, स्टडआउट और स्टडर को पुनर्निर्देशित करता है, कुछ ऐसा जो आप कर सकते हैं या नहीं कर सकते हैं। के बीच अंतरnohupdisown& पढ़ें , और एक शिक्षित निर्णय लें।
एक और दृष्टिकोण है parallel
। यह उपयोगी होगा यदि आप जिस कमांड को समानांतर बनाना चाहते हैं वह एक दूसरे के समान है और आप एक पैटर्न को क्राफ्ट कर सकते हैं।
उपकरण का मूल संस्करण ( moreutils
कम से कम , डेबियन में ) आपको एक ही समय में चलने वाली नौकरियों की संख्या को सीमित करने की अनुमति देता है। GNUparallel अधिक उन्नत है। यदि आप जेनरेट आउटपुट चलाना चाहते हैं तो निम्नलिखित विकल्प विशेष रूप से उपयोगी होंगे:
--group
समूह उत्पादन। प्रत्येक कार्य का आउटपुट एक साथ समूहीकृत किया जाता है और केवल तभी प्रिंट किया जाता है जब कमांड समाप्त हो जाती है। Stdout (मानक आउटपुट) पहले stderr (मानक त्रुटि) के बाद आता है। […]
( स्रोत )
( --group
डिफ़ॉल्ट रूप से सक्षम है, इसलिए आमतौर पर आपको इसे स्पष्ट रूप से उपयोग करने की आवश्यकता नहीं है।)
--keep-order
-k
आउटपुट का क्रम इनपुट के क्रम के समान रखें। नौकरी पूरा होते ही आम तौर पर नौकरी का आउटपुट छप जाएगा। […]-k
केवल उस क्रम को प्रभावित करता है जिसमें आउटपुट मुद्रित होता है - उस क्रम में नहीं, जिसमें नौकरी चलती है।
( स्रोत )
उनके साथ कई नौकरियों से उत्पादन का आयोजन किया जाएगा, कुछ आप से नहीं मिल सकता है &
। कभी-कभी आप आउटपुट के बारे में परवाह नहीं करते हैं लेकिन फिर भी अनुक्रम के बारे में परवाह करते हैं; जैसे मेरा यह उत्तर जहाँ GNU parallel
का उपयोग कई curl
प्रक्रियाओं को समानांतर करने और अनुक्रम को बनाए रखते हुए प्रत्येक से बाहर निकलने की स्थिति प्राप्त करने के लिए किया जाता है ।
डेबियन GNU parallel
में एक पैकेज में है parallel
। एक अलग निष्पादन योग्य के रूप में parallel
किसी भी शेल से चलाया जा सकता है।
ऐसा करने का सबसे अच्छा तरीका nohup
कमांड &
के अंत में संलग्न किए गए कमांड के साथ कमांड को जोड़ना है
अस्पष्ट है कि आपका मूल लक्ष्य क्या है, लेकिन मुझे उम्मीद है कि मदद मिलेगी!
लिनक्स मशीन पर पृष्ठभूमि प्रक्रिया के रूप में किसी भी कमांड को चलाने के लिए, आपको कमांड को पहले से तैयार करना चाहिए nohupऔर &
अंत तक जोड़ना चाहिए ।
तो अंतिम आदेश होगा:
nohup [your command] &
इसका nohup
मतलब है कि कमांड को "हैंग अप्स" को नजरअंदाज करना चाहिए और इसमें &
जोड़ा गया एम्पर्सैंड एक शेल कमांड है जो सिस्टम को बैकग्राउंड प्रोसेस के रूप में चलाने के लिए कहता है। इसके उपयोग के बारे में अधिक जानकारी यहां पाई जा सकती है ।
जब आप इस तरह एक कमांड चलाते हैं, तो प्रक्रिया चलेगी, आपको कमांड प्रॉम्प्ट पर वापस भेजा जाएगा और आप टर्मिनल सत्र से बाहर निकल सकते हैं या उस टर्मिनल सत्र के दौरान उस कमांड से संबंधित कुछ और भी कर सकते हैं।