सभी समय फ़ोल्डर में बैश स्क्रिप्ट चलाएँ


10

मान लें कि मेरे पास .shफ़ोल्डर ( my_folder) में पांच बैश ( ) स्क्रिप्ट हैं , और उन्हें निम्नानुसार नाम दिया गया है:

script_1.sh
script_2.sh
script_3.sh
script_4.sh
script_5.sh

मैं एक छठी बैश स्क्रिप्ट या सिर्फ एक लाइनर कैसे लिख सकता हूं जो इन सभी स्क्रिप्टों को एक साथ चलाना शुरू कर देगा?

मुझे एक ही समय में एक साथ चलने के लिए पांच स्क्रिप्ट की आवश्यकता है और एक के बाद एक नहीं।


जवाबों:


12

GNU parallelइस तरह की चीज़ के लिए एकदम सही है। के साथ स्थापित करें sudo apt install parallelऔर फिर:

parallel -j0 ::: my_folder/*sh

-jनियंत्रण कितने प्रक्रियाओं टी समानांतर में चलाने के लिए, और -j0इसका मतलब है "उन सभी को"। -j20इसके स्थान पर स्क्रिप्ट को चलाने के लिए इसे दूसरे मान (जैसे ) पर सेट करें ।


1
नोट: पैकेज parallelसे भी कमांड है moreutils। उदाहरण का उपयोग: parallel -j 20 -- my_folder/*.sh(GNU के विपरीत parallel, -j0एक समय में स्क्रिप्ट को चलाएगा)।
JFS

1
@jfs अच्छी बात है। लेकिन ध्यान दें कि sudo apt install parallelफ़ाइल /usr/bin/parallelको GNU समानांतर से एक के साथ बदल देगा । इसलिए जब तक आप इसे स्थापित करते हैं, जैसा कि मेरा उत्तर बताता है, इसे उम्मीद के मुताबिक काम करना चाहिए।
टेराडॉन

हां, मुझे यह पता चला है कि जब parallelजीएनयू समानांतर का सुझाव देने के लिए अपना उत्तर लिखता है, तो मैनुअल से असफल आदेशों की कोशिश करते हुए यह कठिन रास्ता है ।
JFS

9

एक ही समय में (समानांतर में) सभी लिपियों को चलाने के लिए:

script_1.sh &
script_2.sh &
script_3.sh &
script_4.sh &
script_5.sh &

एक के बाद एक चलाने के लिए (क्रमिक रूप से) उपयोग करें:

script_1.sh &&
script_2.sh &&
script_3.sh &&
script_4.sh &&
script_5.sh

टिप्पणियों के लिए एन्हांसमेंट

यदि आपके पास 200 स्क्रिप्ट्स हैं जिन्हें आप उसी समय चलाना चाहते हैं (जो मशीन BTW को तोड़ सकती है) इस स्क्रिप्ट का उपयोग करें:

#!/bin/bash
for Script in my_folder/*.sh ; do
    echo bash "$Script" &
done

कमांड के साथ निष्पादन योग्य स्क्रिप्ट स्क्रिप्ट सेट करें:

chmod a+x /path/to/script.sh

पहली बार जब आप स्क्रिप्ट चलाते हैं तो यह केवल 200 स्क्रिप्ट के नामों को प्रतिध्वनित करेगा जो इसे निष्पादित करेगा। जब आप खुश होते हैं तो सही नामों का चयन किया जाता है स्क्रिप्ट को संपादित करें और इस पंक्ति को बदलें:

    echo bash "$Script" &

सेवा:

    bash "$Script" &

तीन तरीके हैं जिनसे आप एक बेस् स्क्रिप्ट को दूसरी जगह से कॉल कर सकते हैं जैसे कि यहाँ उत्तर दिया गया है

  1. अन्य स्क्रिप्ट को निष्पादन योग्य बनाएं, #!/bin/bashशीर्ष पर लाइन जोड़ें , और वह पथ जहां फ़ाइल $PATHपर्यावरण चर में है। तब आप इसे सामान्य आदेश कह सकते हैं;

  2. या इसे सोर्स कमांड के साथ कहें (उपनाम है।) इस तरह source /path/to/script:;

  3. या इसे निष्पादित करने के लिए बैश कमांड का उपयोग करें /bin/bash /path/to/script:;

ओपी के मामले में 200 में से एक या अधिक स्क्रिप्ट #!/bin/bashमें फ़ाइल में शेबंग पहली पंक्ति नहीं थी । इस तरह के विकल्प के रूप में 3. इस्तेमाल किया जाना था।


एक ही समय में चल रहे 200 लिपियाँ

इस बारे में एक टिप्पणी की गई है कि क्या वे "एक ही समय में चल रहे हैं"। एक सामान्य 8 सीपीयू प्रणाली पर 25 स्क्रिप्ट एक ही समय में एक सीपीयू साझा करेंगे लेकिन एक समय में टुकड़ा (मिलीसेकंड में मापा जाता है) तक केवल एक ही स्क्रिप्ट निष्पादित होगी। फिर अगली नौकरी मिलिसकॉन्ड के अपने उचित हिस्से को प्राप्त करेगी, फिर अगली नौकरी, आदि, आदि।

ढीले शब्दों में हम कह सकते हैं कि 200 नौकरियां "समवर्ती" चल रही हैं, लेकिन 8 सीपीयू के पार "एक साथ" नहीं हैं, जो प्रति सीपीयू 25% के बराबर हैं:

सूत्र बताता है

लिनक्स कर्नेल अनुसूचक से नीचे की छवि और टिप्पणियाँ

समय टुकड़ा


धन्यवाद.. बात यह है कि मेरे वास्तविक मामले में मेरे पास चलाने के लिए 200 से अधिक स्क्रिप्ट हैं। तो क्या कोई तरीका है कि मैं उन सभी को एक ही आदेश के साथ चला सकूँ (अर्थात उनकी फ़ाइल के नाम लिखे बिना)?
aaaaa

@aaaaa मैंने 200 लिपियों के लिए उत्तर बदल दिया है।
विनयुनुच्स

धन्यवाद। यह काम करता है .. केवल एक चीज जो मुझे आपकी अंतिम पंक्ति में जोड़ना था वह थी 'बैश'। अन्यथा मुझे 'अनुमति से वंचित' कर दिया जाता है।
--ा

1
@aaaaa क्या आप वास्तव में पसंद करते हैं कि सभी 200+ स्क्रिप्ट्स एक ही समय पर चलें, या क्या आपके पास कुछ छोटी संख्याएँ होंगी (जैसे, 10) एक समय में चलती हैं, जबकि अन्य को चलाने के लिए कतारबद्ध होती हैं जब उनमें से एक या अधिक खत्म होती हैं और वर्तमान में चल रही स्क्रिप्ट की संख्या उस संख्या से कम हो जाती है? (यदि आप इस तरह के समाधानों में रुचि रखते हैं, तो मैं आपके प्रश्न को संपादित करने के बारे में जानकारी देता हूं कि आपके पास कितनी स्क्रिप्ट्स हैं, वे कितने समय तक चलना चाहते हैं, वे किस तरह का काम करते हैं, और आगे।)
एलिया कागन

@aaaaa प्रतिक्रिया के लिए धन्यवाद। मैंने bashस्क्रिप्ट को कॉल करने के लिए उपसर्ग शामिल करने के उत्तर को अपडेट किया है ।
WinEunuuchs2Unix

3

इसके लिए एक उपकरण है, पढ़ें man run-parts

उदाहरण के लिए, मैं:

 run-parts ${visorhome}/pbackup.d/

मेरे पाम पायलट बैकअप स्क्रिप्ट में। ${visorhome}/pbackup.d/:

01PopulateJpilot  02Extract_Pedometer  03URLs  04google  05Books  06Weight  07Sec  08Bkgm 50hardlinks

1
@ eliah-kagan रनिंग "एक ही समय में" 200 से अधिक स्क्रिप्ट्स "" नासमझी लगती है। यह तनाव का एक अच्छा तरीका हो सकता है एक प्रणाली का परीक्षण
वॉल्टिनेटर

अच्छी बात। मुझे लगता है कि आप अभी भी उल्लेख करना चाहते हैं कि run-partsलिपियों को क्रमबद्ध रूप से निष्पादित किया जा सकता है बजाय एक बार ओपी के अनुरोध के। हालाँकि, आप सही हैं, कि एक बार में 200 स्क्रिप्ट को चलाने के लिए 5 के रूप में एक ही प्रदर्शन करने की संभावना नहीं है - और यहां तक ​​कि अगर उन सभी को एक बार चलाने से कोई समस्या नहीं होती है, तो भी यह अनावश्यक हो सकता है। मैं गया है टिप्पणी की सुझाव देने के लिए ओपी इस संबंध में उनकी प्राथमिकताओं को स्पष्ट।
एलियाह कगन

run-partsस्क्रिप्ट नहीं चलाएंगे (उनके नाम में एक डॉट है:my_folder/*.sh
jfs

1
run-partsबहुत अजीब कारण के लिए बहुत विशिष्ट फ़ाइल नाम आवश्यकताओं है। यह एक्सटेंशन के साथ फ़ाइल नाम लॉन्च नहीं करेगा, इसलिए मुझे डर है कि यह यहां काम नहीं करेगा।
टेराडॉन

1

का उपयोग करते हुए एक ही समय *.shमें my_folderनिर्देशिका में सभी लिपियों को चलाने के लिए xargs:

$ ls my_folder/*.sh | xargs -P0 -n1 bash

समवर्ती निष्पादित स्क्रिप्ट की संख्या को सीमित करने के लिए 10:

$ ls my_folder/*.sh | xargs -P10 -n1 bash

lsस्क्रिप्ट के आउटपुट का उपयोग करना एक बुरा अभ्यास है । का उपयोग करना findअधिक सुरक्षित है। यह यहाँ की पहली पहली वस्तु है: mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29
जो

@ सामान्य तौर पर, यह सच है। मुझे इस विशेष मामले में समस्याएँ नहीं दिख रही हैं।
बजे

ऐसा इसलिए क्योंकि आप इसके बारे में पहले से ही जानते हैं। बाद में यहां आने वाले लोग शायद नहीं।
जो

@ जो आँख बंद करके हठधर्मिता का पालन नहीं करते। अपने लिए एक विकल्प से बेहतर सोचें कि आपके मामले में व्यापार की स्थिति क्या है।
JFS

यह हठधर्मिता नहीं है। मैं उन लोगों से एलर्जिक हूं। लेकिन मैंने देखा है कि सामान एलएस उत्सर्जन कर सकता है। मानव पठनीय आउटपुट पार्स करना विश्वसनीय नहीं है। डेवलपर्स के लिए रखने के लिए कोई प्रोत्साहन नहीं है
जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.