2012-06-06 12 views
35

मैं कुछ कमांड चलाने के लिए चाहता हूं, जिनमें से प्रत्येक Ctrl-C दबाए जाने तक नहीं छोड़ा जाता है। क्या मैं उन सभी को एक साथ चलाने के लिए चला सकता हूं, और Ctrl-C उन सभी को छोड़ देगा? वे टर्मिनल आउटपुट साझा कर सकते हैं।उसी टर्मिनल में एक साथ समानांतर एकाधिक कमांड चलाएं

विशेष रूप से, मेरे पास कंपास कंपाइलर, कॉफ़ीस्क्रिप्ट कंपाइलर और एक कस्टम कमांड है जो फ़ाइल परिवर्तनों के लिए देख रहे सभी फ़ाइल परिवर्तनों के लिए देखता है। मैं प्रत्येक कमांड के लिए टर्मिनल लोड नहीं करना चाहता हूं।

उत्तर

73

यह बैश स्क्रिप्ट एन समांतर धागे के लिए है। प्रत्येक तर्क एक आदेश है।

trap सिगिनट पकड़ने पर सभी उपप्रोसेसरों को मार देगा।
wait $PID_LIST प्रत्येक प्रक्रिया को पूरा करने का इंतजार कर रहा है। जब सभी प्रक्रियाएं पूरी हो जाती हैं, तो प्रोग्राम निकलता है।

#!/bin/bash 

for cmd in "[email protected]"; do { 
    echo "Process \"$cmd\" started"; 
    $cmd & pid=$! 
    PID_LIST+=" $pid"; 
} done 

trap "kill $PID_LIST" SIGINT 

echo "Parallel processes have started"; 

wait $PID_LIST 

echo 
echo "All processes have completed"; 

सहेजें parallel_commands रूप में इस स्क्रिप्ट और यह निष्पादन योग्य बनाते हैं। जब तक "नींद 4" खत्म

parallel_commands "sleep 1" "sleep 2" "sleep 3" "sleep 4" 

प्रारंभ 4 समानांतर नींद और प्रतीक्षा करता है:

parallel_commands "cmd arg0 arg1 arg2" "other_cmd arg0 arg2 arg3" 

उदाहरण:
यह कैसे इस स्क्रिप्ट का उपयोग करने के लिए है।

+1

बहुत अच्छा। जाल वह है जिसे मैं ढूंढ रहा था। मैंने आपके उत्तर को 'प्रतीक्षा' शामिल करने के लिए संपादित किया है, जो अनावश्यक "प्रक्रिया x exited" संदेशों को दबाएगा। –

+1

@ एमटीएसओएल, 'प्रतीक्षा' लूप के मुकाबले बेहतर है। मैंने आपके सुझाव के साथ अपनी स्क्रिप्ट में सुधार किया है। यह अब एन समांतर कमांड के लिए भी काम करता है। –

+0

प्रत्येक सेमीड को एक अलग कोर पर चलाने के बारे में क्या? क्या मुझे इस तरह चलाना चाहिए: ./parallel_commands "taskset -c 0 cmd arg0 arg1 arg2" "taskset -c 1 other_cmd arg0 arg2 arg3" या taskset -c 2 ./parallel_commands "taskset -c 0 cmd arg0 arg1 arg2" "taskset -c 1 अन्य_cmd arg0 arg2 arg3 " – user2517676

18

उपयोग जीएनयू समानांतर:

(echo command1; echo command2) | parallel 
parallel ::: command1 command2 

को मारने के लिए:

parallel ::: command1 command2 & 
PID=$! 
kill -TERM $PID 
kill -TERM $PID 
+1

यह सही उत्तर है। https://www.gnu.org/software/parallel/ – 0atman

+1

@ ओटमैन: यह होना चाहिए, लेकिन जीएनयू समांतर सभी वितरणों में नहीं है। उदाहरण के लिए, आरएचईएल 7 में पैकेज आसानी से उपलब्ध नहीं दिखता है। –

+0

क्या समांतर प्रक्रिया के पीआईडी ​​को ट्रैक करना संभव है जो कई प्रक्रियाओं को शुरू करता है और माता-पिता समानांतर को समाप्त करके उन सभी को समाप्त कर देता है? –

1

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

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

लगाकर कमांड के माध्यम से किया जा सकता है:

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

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

par "PARPREFIX=[script1] script1.sh" "script2.sh" "script3.sh" 
+1

gnu समानांतर का उपयोग करके ऊपर वर्णित करने की कोशिश करने और विफल करने के बाद मैं आपकी उपयोगिता का उपयोग करने की पहली कोशिश में सफल रहा। अच्छा काम! – worldsayshi

+0

पहला: 'समांतर ::: "script1.sh" "script2.sh" "script3.sh" 'दूसरा सामान्य रूप से उपयोग करेगा - टैग: ' समांतर - टैग :::" script1.sh "" script2 .sh "" script3.sh "' –

25

@ Alessandro-pezzato की टिप्पणी के आधार पर, गुणकों आदेशों को चलाने के लिए, आदेशों के बीच बस & का उपयोग करें।

उदाहरण:

$ sleep 3 & sleep 5 & sleep 2 & 

यह पृष्ठभूमि में कमांड चलाने जाएगा। command1 && command2

और अगर आप उन्हें दो अलग अलग टर्मिनलों में चलाना चाहते हैं तो आप इस तरह यह करना:

gnome-terminal -e "command1" && gnome-terminal -e "command2" 

यह खुल जाएगा

+0

यही वह है जिसे मैं ढूंढ रहा था। –

+0

मुझे एक त्रुटि मिलती है जब तक कि मैं अंतिम विस्मयादिबोधक चिह्न को छोड़ देता हूं ... –

+0

हाय @ ऑलटेंज, मुझे अंतर नहीं पता। मैंने '&!' और '&' की कोशिश की और दोनों समान रूप से काम करते थे। – nsantana

-5

कई आदेशों सिर्फ इस तरह && दोनों के बीच आदेशों को जोड़ने को चलाने के लिए 0 टर्मिनल command1 और command2 उनके साथ निष्पादित।

उम्मीद है कि यह आपकी मदद करता है।

+2

यह गलत है। यह 'command1' ** ** ** कमांड 1' के बाद ** केवल तभी होता है जब 'command1' सफल हो। 'नींद 3 और नींद 3' आज़माएं और आप देखेंगे कि इसमें 6 एस लगते हैं। –

+0

कमांड 1 और कमांड 2 एक बार में निष्पादन शुरू नहीं करता है। इसे एक के बाद एक निष्पादित किया जाएगा (कमांड के लिए सफलता परिदृश्य पर विचार)। – Gahan

संबंधित मुद्दे