शेल स्क्रिप्ट बैकग्राउंड कमांड का इंतजार करती है


12

मैं एक पटकथा लिख ​​रहा हूं, लेकिन कुछ ऐसी चीज है जिसकी मुझे जरूरत है कि मैं इसे करने का तरीका नहीं ढूंढ सकता ...

मुझे बैकग्राउंड "कमांड 1" में एक कमांड बनाने की आवश्यकता है और फिर स्क्रिप्ट में कहीं न कहीं मुझे कमांड 2 करने से पहले इसके खत्म होने की प्रतीक्षा करनी होगी। मूल रूप से, मुझे इसकी आवश्यकता है:

नोट: प्रत्येक आदेश एक विशिष्ट निर्देशिका में चलता है! लूप के अंत में मेरे कमांड 1 ने 4 डायरेक्टरी बनाई, जहां हर एक में विशिष्ट प्रक्रिया चलती है, इसलिए चलने वाली प्रक्रिया की कुल संख्या 4 है।

a=1

while [$a -lt 4 ]

     . command1
   #Generates 1 Process  

     a= `export $a +1`
done

   #Wait until the 4 process end and then run the command2 

    . command2

मैंने waitpid प्रोसेस नंबर के साथ कमांड के बारे में कुछ देखा है , लेकिन यह भी काम नहीं किया।


क्या आप नियंत्रण करते हैं command1? क्या आप इसे संशोधित कर सकते हैं ताकि यह 4 प्रक्रियाओं के पीआईडी ​​लौटाए?
terdon

हाँ! मेरे पास पहले से ही :)
जोआओ मकाऊ

मैंने उसी हिसाब से अपना जवाब अपडेट किया है। मुझे बताएं कि क्या यह आपके उदाहरणों से मेल खाता है।
लॉरेंट सी।

यह क्यू इस से संबंधित है: unix.stackexchange.com/questions/100801/… । एकमात्र अंतर यह है कि आपको पीआईडी ​​को पृष्ठभूमि वाली प्रक्रिया से प्राप्त करने की आवश्यकता है। आप इसे $!प्राप्त करने के लिए चर का उपयोग कर सकते हैं , इसे waitकमांड में पास कर सकते हैं जैसा मैंने वहां दिखाया था। $!अंतिम पृष्ठभूमि वाले PID को $$समाहित करता है , जबकि अंतिम प्रक्रिया रन का PID होता है।
स्लम

3
ठीक है, अब आपकी स्क्रिप्ट का कोई मतलब नहीं है। चारों ओर वाक्यविन्यास त्रुटियाँ और विचित्रताएँ हैं। क्या आप हमें वास्तविक स्क्रिप्ट दिखा सकते हैं ? आप सोर्सिंग कमांड क्यों कर रहे हैं? सिर्फ उन पर अमल क्यों नहीं?
terdon

जवाबों:


22

wait PIDकिसी प्रक्रिया के समाप्त होने की प्रतीक्षा करने के लिए आप कमांड का उपयोग कर सकते हैं ।

आप अंतिम कमांड का PID भी प्राप्त कर सकते हैं $!

आपके मामले में, ऐसा कुछ काम करेगा:

command1 & #run command1 in background
PID=$! #catch the last PID, here from command1
command2 #run command2 while command1 is running in background
wait $PID #wait for command1, in background, to end
command3 #execute once command1 ended

अपने संपादन के बाद, जैसा कि आपके पास कई पीआईडी ​​हैं और आप उन्हें जानते हैं, आप ऐसा कर सकते हैं:

command1 & #run command1 in background
PID1=xxxxx
PID2=yyyyy
PID3=xxyyy
PID4=yyxxx
command2 #run command2 while command1 is running in background
wait $PID1 $PID2 $PID3 $PID4 #wait for the four processes of command1, in background, to end
command3 #execute once command1 ended

अपने संपादन के बाद, यदि आप जानते हैं कि पीआईडी ​​बनाया गया है (xxxxx, yyyyy, xxyyy, yyxxx), तो आप पीआईडी ​​की सूची के साथ प्रतीक्षा (यार देखें) का भी उपयोग कर सकते हैं। यदि आप उन्हें नहीं जानते हैं, तो शायद आप उन्हें कमांड 1 में इकट्ठा कर सकते हैं (कमांड 1 क्या है? अपनी खुद की एक स्क्रिप्ट?)
लॉरेंट सी।

संभवतः यह सुनिश्चित करने के लिए कि वे पहले स्थान पर सही ढंग से समूहीकृत हैं। यह कैसे हो सकता है, इस विचार के लिए मेरा उत्तर देखें।
मोकेसर

4

ऐसा करने का सबसे साफ तरीका यह होगा कि आपके comamnd1द्वारा लॉन्च की गई प्रक्रियाओं की पीआईडी ​​लौटाए और waitउनमें से प्रत्येक पर @ लॉरेंटसी के उत्तर के अनुसार सुझाव दिया जाए ।

एक अन्य दृष्टिकोण कुछ इस तरह होगा:

## Create a log file
logfile=$(mktemp)

## Run your command and have it print into the log file
## when it's finsihed.
command1 && echo 1 > $logfile &

## Wait for it. The [ ! -s $logfile ] is true while the file is 
## empty. The -s means "check that the file is NOT empty" so ! -s
## means the opposite, check that the file IS empty. So, since
## the command above will print into the file as soon as it's finished
## this loop will run as long as  the previous command si runnning.
while [ ! -s $logfile ]; do sleep 1; done

## continue
command2

क्षमा करें, लेकिन अभी भी काम नहीं कर रहा है .. मैं अपने प्रश्न को एक बार फिर से सुधारूंगा!
जोआओ मकाऊ

0

यदि आप निम्न विधि का उपयोग करते हैं, तो आपको लूप के बाद एक विशेष "सभी प्रक्रियाओं के लिए प्रतीक्षा करें" की आवश्यकता नहीं हो सकती है। लूप चालू command1होने से पहले शीर्ष पर वापस आने के लिए प्रतीक्षा करेगा । किसी भी सलाह के साथ देखभाल का उपयोग करें। सूचना, केवल एक चीज मैंने किया ऐड था & wait $!अपने के अंत तक command1

a=1
while [$a -lt 4 ]
     . command1  & wait $!
   #Generates 1 Process  
     a= `export $a +1`
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.