रिमोट मशीन पर समानांतर में स्क्रिप्ट कैसे चलाएं?


16

मैं एक रिमोट मशीन में ssh कर सकता हूं जिसमें 64 कोर हैं। कहते हैं कि मुझे इस मशीन पर समानांतर में 640 शेल स्क्रिप्ट चलाने की आवश्यकता है। मैं यह कैसे करु?

मैं प्रत्येक 10 लिपियों में से 64 समूहों को 64 समूहों में विभाजित करते हुए देख सकता हूं। फिर मैं इन समूहों में से प्रत्येक को समानांतर में अर्थात प्रत्येक उपलब्ध कोर में से प्रत्येक पर एक समूह कैसे चलाऊंगा।

प्रपत्र की एक स्क्रिप्ट होगा

    ./script_A &
    ./script_B &
    ./script_C &
    ...

जहाँ script_Aपहले समूह से मेल खाता है, script_Bदूसरे समूह के लिए, आदि?

एक कोर पर चलने वाले एक समूह के भीतर स्क्रिप्ट क्रमिक रूप से चलाने के लिए ठीक है, लेकिन मैं चाहता हूं कि समूह सभी कोर के समानांतर में चलें।


यह गारंटी नहीं है कि वे कोर द्वारा समान रूप से वितरित किए जाते हैं। एक नजर इस धागे पर। stackoverflow.com/questions/13583146/…
रुई एफ रिबेरो

जवाबों:


24

यह गन्न समानांतर के लिए एक नौकरी की तरह दिखता है:

parallel bash -c ::: script_*

लाभ यह है कि आपको अपनी स्क्रिप्ट को कोर द्वारा समूहित करने की आवश्यकता नहीं है, वह आपके लिए parallelकरेगा।

बेशक, यदि आप SSH सत्र को बचाना नहीं चाहते हैं, जबकि स्क्रिप्ट चल रही हैं, तो आपको उपयोग करना चाहिए nohupयाscreen


यह एक अच्छा जवाब है और मैं इसे सामान्य स्थिति में स्वीकार करता हूं क्योंकि यह अच्छी तरह से काम करेगा। दुर्भाग्य से मेरे लिए व्यक्तिगत रूप से मेरे पास रिमोट मशीन के लिए व्यवस्थापक विशेषाधिकार नहीं हैं और इसलिए यह parallelपैकेज स्थापित नहीं कर सकता है । धन्यवाद `
टॉम 16

10
आपको विश्व स्तर पर समानांतर स्थापित करने की आवश्यकता नहीं है: आपको अपनी स्वयं की होम निर्देशिका से एक प्रति चलाने में सक्षम होना चाहिए।
ढग

bash -cअनावश्यक हो सकता है: parallel ::: ./script*। 640 लिपि के साथ यह संभावना है कि वे बहुत समान हैं (उदाहरण के लिए, केवल एक तर्क अलग है)। इसके लिए इन तर्कों को सेट करने और एकल स्क्रिप्ट का उपयोग करने के लिए सीधे जीएनयू समानांतर का उपयोग करने पर विचार करें।
ओले तांगे

मैं दूरस्थ मशीन पर समानांतर रूप से गन्नू कैसे स्थापित करूंगा?
टॉम

@Tom इस तथ्य से क्या बदला है कि आप एक दूरस्थ मशीन का उपयोग कर रहे हैं? बस gnu.org/software/parallel से सही पैकेज प्राप्त करें और इंस्टॉल करें।
दिमित्री ग्रिगोरिव

5

यह तब तक काम करेगा जब तक आपको आउटपुट की निगरानी करने की आवश्यकता नहीं होती है और जब तक स्क्रिप्ट चलाने के लिए आपका ssh सत्र खुला रहता है तब तक आप इसे छोड़ सकते हैं। यदि उनमें से कोई भी सत्य नहीं है, तो मैं screenकई टैब के साथ उपयोग करने की सलाह दूंगा। आप कुछ ऐसा कर सकते थे

screen
for script in script_A script_B script_C; do
  screen -t "$script" ./$script
done;

जिन आउटपुट से मैं चिंतित नहीं हूं उनकी निगरानी करना - मैं ssh सत्र को खुला नहीं छोड़ना चाहता। नोह का उपयोग करने के बारे में क्या? यदि सत्र समाप्त नहीं होता है तो यह स्क्रिप्ट को रोकने से रोक देगा? आपकी स्क्रीन सिफारिश पर मेरी भी नज़र होगी। धन्यवाद!'
टॉम

nohupशायद काम करेगा, मैं अभी और अधिक परिचित हूँ screenऔर इसकी बहुत अधिक कार्यक्षमता है जो आपके लिए उपयोगी हो सकती है या नहीं।
डेविड किंग

2

बड़ी संख्या में स्क्रिप्टिंग नौकरियों को बंद करने और प्रबंधित करने के लिए, आपको संसाधन उपयोग (सीपीयू, मेमोरी, प्राथमिकता) को नियंत्रित करने के लिए किसी प्रकार के प्रबंधन सॉफ़्टवेयर की आवश्यकता होगी, नौकरी की स्थिति देखें (प्रतीक्षा करें, निलंबित करें, चल रहे, समाप्त)।

ग्रिड इंजन उसी के लिए बनाया गया है, उदाहरण के लिए, Sun Grid Engine ( http://wiki.gridengine.info/wiki/index.php/Main_Page ) या ओपन ग्रिड शेड्यूलर ( http://gridscheduler.siveforge.net/ )। शुरू करने से पहले आपको अपने लिए उचित सॉफ़्टवेयर स्थापित करने के लिए व्यवस्थापक की आवश्यकता होती है। व्यवस्थापक को ऐसा करने में खुशी हो सकती है, जो मशीन पर चल रही सैकड़ों प्रक्रियाओं को देखने के बजाय उन पर कोई नियंत्रण नहीं रखता है।

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



0

मैंने कई अवसरों पर ऐसा किया है और आमतौर पर नौकरी नियंत्रण के साथ काम करने के लिए अपनी स्क्रिप्ट को रोल करता हूं। आम तौर पर यदि आपके पास उन सभी लिपियों के नाम हैं जिन्हें आप एक फ़ाइल में चलाना चाहते हैं तो समाधान इस तरह दिखता है:

#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
  NUM=$((NUM+1))
  ssh remote.host.ip "${script}" > ${script}.log 2>&1 &
  if [ $NUM -ge $MAX_PROCS ];then
    echo "Waiting for $NUM processes to finish."
    wait
    NUM=0
  fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit

यह क्रूर बल है, लेकिन प्रभावी है। साथ ही आपको किसी भी अतिरिक्त सॉफ़्टवेयर की आवश्यकता नहीं है जैसे समानांतर को आपके सिस्टम में जोड़ा जाए।

एक बड़ी समस्या यह है कि प्रतीक्षा कमांड सबसे धीमी स्क्रिप्ट के खत्म होने तक इंतजार करेगी, जो समय बर्बाद कर सकती है। मैंने इस स्थिति का ध्यान रखने के लिए स्क्रिप्ट बनाई है, लेकिन वे अधिक जटिल हैं जैसा कि आप कल्पना कर सकते हैं। यदि आपकी सभी स्क्रिप्ट लगभग समान समय में चलती हैं, तो यह अच्छी तरह से काम करता है।

एक और समस्या यह है कि आपको सबसे अच्छा प्रदर्शन निर्धारित करने के लिए MAX_PROCS ट्यून करना पड़ सकता है।

निश्चित रूप से, ssh कनेक्शनों की संख्या कमतर हो सकती है। जिस स्थिति में बस इस स्क्रिप्ट को दूरस्थ होस्ट पर ले जाएँ और "ssh ..." लाइन को बदलकर केवल स्क्रिप्ट को सीधे चलाने के लिए।

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