2012-06-28 42 views
7

मैं है निम्नलिखित बैश स्क्रिप्ट, हम इसे script1.sh कॉल कर सकते हैं:कैसे जांचें कि पृष्ठभूमि की नौकरी जिंदा है या नहीं? (बैश)

#!/bin/bash 

exec ./script2.sh & 

sleep 5 

if job1 is alive then #<--- this line is pseudo-code! 
    exec ./script3.sh & 
    wait 
fi 

के रूप में देखा जा सकता है, स्क्रिप्ट एक पृष्ठभूमि के रूप में काम script2.sh निष्पादित करता है और फिर 5 सेकंड इंतजार कर रहा है (ताकि script2.sh कुछ प्रारंभ कर सकते हैं सामान)। यदि प्रारंभिकता सफल होती है, तो script2.sh नौकरी अभी भी जीवित रहेगी, इस मामले में मैं script3.sh समवर्ती रूप से शुरू करना चाहता हूं; यदि नहीं, तो मैं बस छोड़ना चाहता हूं।

हालांकि, मुझे नहीं पता कि पहली नौकरी जिंदा है या नहीं, इसलिए छद्म कोड की रेखा। तो, इसके स्थान पर क्या जाना चाहिए?

+2

रनिंग निष्पादन जो भी आपको लगता है वह नहीं करेगा। यह मौजूदा प्रक्रिया को एक नई प्रक्रिया के साथ बदल देगा; आपकी लिपि में बाद की रेखाएं नहीं पहुंचेगी। –

उत्तर

9

आप $! के साथ सबसे हाल की पृष्ठभूमि नौकरी का पीआईडी ​​प्राप्त कर सकते हैं। फिर यह निर्धारित करने के लिए कि वह विशेष पीआईडी ​​अभी भी प्रक्रिया सूची में है या नहीं, यह निर्धारित करने के लिए आप ps की निकास स्थिति देख सकते हैं। उदाहरण के लिए:

if jobs %% 
    exec ./script3.sh & 
    wait 
fi 

jobs %% प्रिंट सबसे हाल ही में पृष्ठभूमि प्रक्रिया ("मौजूदा नौकरी") का काम आईडी और 0 रिटर्न:

sleep 30 & 
if ps -p $! >&-; then 
    wait $! 
else 
    jobs 
fi 
+2

वह सटीक आदेश मुझे त्रुटि ps देता है: लिखने में त्रुटि: खराब Filedescriptor – FORTRAN

+0

यह हमेशा काम नहीं करता है। उदाहरण के लिए, अल्पाइन लिनक्स में, डिफ़ॉल्ट "ps" BusyBox से जुड़ा हुआ है, जो -p स्विच का समर्थन नहीं करता है। 'नौकरियों 'जैसे' बश 'बिल्ट-इन्स का उपयोग करना अधिक पोर्टेबल है। –

3

मुझे यकीन है कि नहीं कार्यकारी पृष्ठभूमि के साथ काम करता है, के रूप में यह बच्चे प्रक्रिया के साथ माता पिता प्रक्रिया की छवि को बदल देता हूँ, अन्यथा, हम यह मान यदि आप कार्यकारी से छुटकारा पाने के लिए, आप की तरह कुछ चाहते हैं:

#!/bin/bash 
./script2.sh& 
pid1=$! 

if kill -0 $pid1; then 
    ./script3.sh& 
    pid3=$! 
    wait 
fi 
6

आप देख सकते हैं एक संकेत प्रदेय

./script2 & 
myPid=$! 
sleep 5 

if kill -0 "$myPid"; then 
    script3 & 
    wait 
fi 
0

jobs आदेश पर एक नज़र डालें है; यह सभी चल रही नौकरियों की सूची है।

4

fduff के जवाब पर विस्तार करने के लिए आप jobs निर्मित उपयोग कर सकते हैं सफलता पर या 1 यदि ऐसी कोई नौकरी नहीं है।