कई बैश स्क्रिप्ट को कॉल करना और उन्हें समानांतर में चलाना, अनुक्रम में नहीं


19

मान लीजिए कि मैं तीन (अधिक या) bash स्क्रिप्ट: script1.sh, script2.sh, और script3.sh। मैं इन तीनों लिपियों को कॉल करना और उन्हें समानांतर में चलाना चाहूंगा । ऐसा करने का एक तरीका सिर्फ निम्नलिखित आदेशों को निष्पादित करना है:

nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &

(सामान्य तौर पर, स्क्रिप्ट को समाप्त होने में कई घंटे या दिन लग सकते हैं, इसलिए मैं इसका उपयोग करना चाहूंगा nohupताकि जब तक कोई कंसोल बंद न हो जाए तब भी वे चलते रहें।)

लेकिन, क्या एकल कॉल के साथ समानांतर में उन तीन कमांड को निष्पादित करने का कोई तरीका है ?

मैं कुछ ऐसा ही सोच रहा था

nohup bash script{1..3}.sh &

लेकिन इस पर अमल के लिए प्रकट होता script1.sh, script2.shऔर script3.shअनुक्रम में, समानांतर में नहीं।


2
"सिंगल कॉल" का क्या अर्थ है?
jw013

1
उपयोग मामला क्या है? क्या आपके पास शुरू करने के लिए एक लाख स्क्रिप्ट हैं?
l0b0

@ jw013 मेरा मतलब है, सिंगल शॉर्ट लाइन कमांड जैसा कुछ। यदि मेरे पास शुरू करने के लिए 100 स्क्रिप्ट हैं, तो मैं 100 अलग-अलग समय टाइप करने के बजाय कुछ कम (जैसे nohup bash script{1..100}.sh &या for i in {1..100}; do nohup bash script{1..100} &; done) टाइप करने में सक्षम होना चाहूंगा nohup bash script*.sh &
एंड्रयू

1
यदि स्क्रिप्ट में उपयोगी आउटपुट होता है: कंसोल समस्या को हल करने के लिए आप उन्हें screen(या tmux) भी शुरू कर सकते हैं , लेकिन आउटपुट (और इनपुट) तक पहुंच बनाए रख सकते हैं।
हौके लेजिंग

1
ऐसा कुछ भी नहीं है जो आपको उन तीनों कमांडों को एक ही पंक्ति में टाइप करने से रोकता है। nohup ... & nohup ... & nohup ... &। यदि आप इसके बजाय इसका मतलब है कि आप प्रत्येक स्क्रिप्ट नाम को अलग-अलग टाइप किए बिना सभी स्क्रिप्ट चलाना चाहते हैं, तो एक साधारण लूप यह करेगा।
jw013

जवाबों:



14

जीएनयू समानांतर का उपयोग करने का एक बेहतर तरीका होगा । जीएनयू समानांतर सरल है और इसके साथ हम नौकरियों पर अधिक नियंत्रण के साथ समानांतर चलने के लिए नौकरियों की संख्या को नियंत्रित कर सकते हैं।

नीचे दिए गए आदेश में, script{1..3}.shविस्तारित हो जाता है और bashसमानांतर में तर्क के रूप में भेजा जाता है । यहां -j0यह इंगित करता है कि जितना संभव हो उतने काम चलाने चाहिए। डिफ़ॉल्ट रूप से parallelएक सीपीयू कोर के लिए एक नौकरी चलाता है।

$ parallel -j0 bash :::: <(ls script{1..3}.sh)

और आप उपयोग करके भी देख सकते हैं

$ parallel -j0 bash ::: script{1..3}.sh

दूसरी विधि को निष्पादित करते समय यदि आपको कोई त्रुटि संदेश मिलता है तो इसका मतलब है कि --tollefविकल्प में सेट /etc/parallel/configकिया गया है और जिसे हटाने की आवश्यकता है और हर चीज ठीक काम करेगी।

अधिक समृद्ध विकल्पों के लिए आप यहांGNU Parallels मैन पेज पढ़ सकते हैं ।

और यदि आपका काम रिमोट मशीन से चल रहा है, screenतो बेहतर है कि नेटवर्क की समस्याओं के कारण सत्र बंद न हो। nohupके साथ आने वाले के रूप में पार्टी के हाल के संस्करणों के रूप में, आवश्यक नहीं है huponexitके रूप में offहै और इस भेजने से माता-पिता खोल पाएगा HUPइसके बाहर निकलने के दौरान अपने बच्चों को संकेत। मामले में अगर इसके साथ परेशान नहीं करते हैं

$ shopt -u huponexit  

यदि आप उपयोग करने जा रहे हैं bashतो शेल parallel -j0 bash :::: <(ls script{1..3}.sh)को घटाया जा सकता है parallel -j0 bash :::: script{1..3}.sh, नहीं?
इरुवर

नहीं, इसकी नहीं, जब '::::' का उपयोग समानांतर के साथ किया जाता है, तो इसका मतलब है कि तर्क एक फाइल है जिसमें कमांड को निष्पादित किया जाना है और न कि कमांड को ही। यहां हम एक स्क्रिप्ट डिस्क्रिप्टर के भीतर स्क्रिप्ट नामों को पुनर्निर्देशित करने के लिए प्रक्रिया प्रतिस्थापन का उपयोग कर रहे हैं।
कन्नन मोहन

एर .. उस मामले में क्यों नहीं parallel -j0 bash ::: script{1..3}.sh?
इरुवर

इसे bash ::: script{1..3}.shपारित किया जा रहा है parallel, नहीं ::: script{1..3}.sh। तो यह पहले के लिए विस्तार करना चाहिए parallel bash ::: script1.sh script2.sh script3.shखोल और तब तक parallelके आमंत्रण bash script1.sh, bash script2.sh, bash script3.sh। मैंने इसे आजमाया
इरुवर

1
नहीं, मैं भ्रमित नहीं हूं, मैं यह कह रहा हूं कि ओपी की समस्या का बेहतर समाधान है parallel -j0 bash ::: script{1..3}.sh- यह ::::दृष्टिकोण से बेहतर है क्योंकि यह प्रक्रिया प्रतिस्थापन की आवश्यकता से बचा जाता है। इसके अलावा पार्सिंग एलएस आउटपुट को नुकसान के साथ देखा जाता है
इरुवर

9

हम xargsसमानांतर में कई स्क्रिप्ट चलाने के लिए भी उपयोग कर सकते हैं ।

$ ls script{1..5}.sh|xargs -n 1 -P 0 bash

यहाँ प्रत्येक लिपि को तर्क के रूप में अलग से काटने के लिए पारित किया गया है। -P 0इंगित करता है कि समानांतर प्रक्रिया की संख्या यथासंभव अधिक हो सकती है। यह भी सुरक्षित है कि बैश डिफ़ॉल्ट का उपयोग करना job control feature (&)


5

एक एकल लाइन समाधान:

$ nohup bash script1.sh & nohup bash script2.sh & nohup bash script3.sh &

कम स्पष्ट रूप से, बस एक आवरण स्क्रिप्ट का उपयोग करें:

$ cat script.sh
#!/usr/bin/env bash
script1.sh &
script2.sh &
script3.sh &
$ nohup script.sh &

या उन पर पाश:

for script in dir/*.sh
do
    nohup bash "$script" &
done

2

यदि आप अपने आप को कुछ टाइपिंग प्रयास करने के लिए देख रहे हैं

eval "nohup bash "script{1..3}.sh" &"

या दूसरे विचारों पर, शायद नहीं


1

इस टूल को चेकआउट करें: https://github.com/wagoodman/bashful

कहो तुम्हारे पास mytasks.yamlहै

tasks:
    - name: A title for some tasks
      parallel-tasks:
        - cmd: ./script1.sh
        - cmd: ./script2.sh -x an-arg
        - cmd: ./script3.sh -y some-other-arg

और आप इसे ऐसे चलाते हैं:

nohup bashful run mytasks.yaml

आपकी स्क्रिप्ट एक वर्टिकल प्रोग्रेस बार (+ एटा के साथ चलती है अगर आप इसे पहले चला चुके हैं और समय नियत है)। यदि आप समानांतर में भागना चाहते हैं तो आप कितने काम कर सकते हैं यदि आप यहां दिए गए 3 से अधिक भागना शुरू करते हैं:

config:
    max-parallel-commands: 6
tasks:
    ...

डिस्क्लेमर: मैं लेखक हूं।


0

मैं बहुत सरल उपयोगिता का सुझाव दे रहा हूं जो मैंने अभी लिखा है। इसे वर्तमान में बराबर कहा जाता है, लेकिन इसका नाम बदलकर या तो parl या pll कर दिया जाएगा, अभी तक इसका निर्णय नहीं किया गया है।

https://github.com/k-bx/par

एपीआई के रूप में सरल है:

par "script1.sh" "script2.sh" "script3.sh"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.