कुछ कमांड के बाद बैश कमांड चलाएं?


13

मैं समानांतर में कुछ कमांड चलाना चाहता हूं। जब ये सभी कमांड समाप्त हो जाएँ तो अगले को शुरू करें। मैं हालांकि निम्नलिखित दृष्टिकोण काम करेंगे

#!/bin/bash
command1 &
command2 &
command3 &&
command4

लेकिन ऐसा नहीं हुआ। मुझे चलाने की ज़रूरत है command4जब पहले तीन आदेश पूरी तरह से समाप्त हो गए हैं।

जवाबों:


28
#!/bin/bash
command1 &
command2 &
command3 &

wait
command4

wait (बिना किसी तर्क के) तब तक इंतजार करेंगे जब तक कि सभी पृष्ठभूमि वाली प्रक्रियाएं बाहर नहीं निकल जातीं।

मैनुअल waitमें पूरा विवरण bash:

wait [-n] [n ...]

प्रत्येक निर्दिष्ट बच्चे की प्रक्रिया के लिए प्रतीक्षा करें और अपनी समाप्ति की स्थिति वापस करें। प्रत्येक nएक प्रक्रिया आईडी या नौकरी विनिर्देश हो सकता है; यदि नौकरी की युक्ति दी जाती है, तो उस नौकरी की पाइपलाइन की सभी प्रक्रियाओं का इंतजार किया जाता है। यदि nनहीं दिया गया है, तो वर्तमान में सभी सक्रिय बच्चे प्रक्रियाओं के लिए इंतजार कर रहे हैं, और वापसी की स्थिति शून्य है। यदि -nविकल्प की आपूर्ति की जाती है, तो waitकिसी भी नौकरी को समाप्त करने के लिए इंतजार करता है और अपनी निकास स्थिति लौटाता है। यदि nकिसी गैर-मौजूद प्रक्रिया या नौकरी को निर्दिष्ट करता है, तो रिटर्न की स्थिति 127 है। अन्यथा, वापसी की स्थिति अंतिम प्रक्रिया या नौकरी की प्रतीक्षा की स्थिति है।


1
एक अन्य विकल्प यह है कि प्रत्येक बच्चे के पीआईडी ​​को किसी चीज़ का उपयोग करके बचाया जाए PID1=$!और फिर उन सभी के साथ प्रतीक्षा करें wait "$PID1" "$PID2" "$PID3"। यह थोड़ा अधिक जटिल है, लेकिन यह काम करेगा यदि प्रक्रिया में अन्य बच्चे हैं जो आप के लिए इंतजार नहीं करना चाहते हैं।
कैस्परल्ड

1
उस मामले में एक सरणी के साथ @kasperd बेहतर: cmd1 & pids=( $! ); cmd2 & pids+=( $! ); cmd3 & pids+=( $! ); wait "${pids[@]}"या कुछ इसी तरह।
Kusalananda

@kasperd "बेहतर" से मेरा मतलब है "केवल एक चर का उपयोग करता है"। कई का उपयोग करने के साथ स्वाभाविक रूप से कुछ भी गलत नहीं है, और इस तरह के छोटे मामलों के लिए शायद पूरी तरह से ठीक है।
Kusalananda

0

मुझे waitउत्तर पसंद है , लेकिन सिर्फ एक अकादमिक अभ्यास के रूप में, मुझे लगता है कि यह भी काम करेगा:

bash -c 'command1 & command2 & command3 &' && command4

यदि मैं गलत हूं तो मुझे बताएं।


2
क्या आपने यह परीक्षण किया? यह पूरी तरह से काम नहीं करता है। उदाहरण: time bash -c "sleep 5 &sleep 5 &sleep 5 &" && echo foo यदि यह नहीं कहता है कि बैश कमांड को पांच सेकंड का समय लगता है, तो उसने वह नहीं किया जो आप चाहते हैं।
सेठ रॉबर्टसन

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