2012-02-13 18 views
29

मुझे लगता है कि करता है के बाद एक पार्टी स्क्रिप्ट की जरूरत है:मैं बैश स्क्रिप्ट से प्रक्रिया आईडी और निकास कोड दोनों कैसे प्राप्त कर सकता हूं?

  • सभी उत्पादन एक फ़ाइल
  • को निर्देश के साथ एक पृष्ठभूमि प्रक्रिया प्रारंभ करता है
  • रिटर्न प्रक्रिया के पीआईडी ​​एक फाइल करने के लिए प्रक्रिया के बाहर निकलने के कोड लिखता है (अभी , जब प्रक्रिया निकलती है)। ,

    $ executable >>$log 2>&1 & 
    pid=`jobs -p` 
    

    या मैं बाहर निकलने के कोड नहीं बल्कि पीआईडी ​​पर कब्जा कर सकते हैं::

  • स्क्रिप्ट से बाहर निकलना होगा

मैं पीआईडी ​​नहीं बल्कि बाहर निकलने के कोड प्राप्त कर सकते हैं

$ executable >>$log; 
# blocked on previous line until process exits 
echo $0 >>$log; 

मैं इन सभी को एक ही समय में कैसे कर सकता हूं?

उत्तर

53

पिड $! में है, jobs चलाने की कोई आवश्यकता नहीं है। और बदले स्थिति wait द्वारा दिया जाता है:

$executable >> $log 2>&1 & 
pid=$! 
wait $! 
echo $? # return status of $executable 

संपादित करें 1

अगर मैं अतिरिक्त आवश्यकता के रूप में एक टिप्पणी में कहा गया है समझते हैं, और आप स्क्रिप्ट आदेश का इंतजार किए बिना तुरंत (लौटना चाहते समाप्त करने के लिए), तो प्रारंभिक स्क्रिप्ट कमांड की निकास स्थिति लिखना संभव नहीं होगा। लेकिन जैसे ही बच्चे खत्म होता है, मध्यस्थता बाहर निकलने की स्थिति लिखने में काफी आसान होता है। कुछ ऐसा:

sh -c "$executable"' & echo pid=$! > pidfile; wait $!; echo $? > exit-status' & 

काम करना चाहिए।

संपादित 2

के रूप में टिप्पणी में कहा, कि समाधान एक रेस स्थिति है: पहले pidfile लिखा है मुख्य स्क्रिप्ट समाप्त हो जाता है। ओपी इसे एक मतदान नींद लूप करके हल करता है, जो घृणित है और मुझे डर है कि मुझे रात में सोने में परेशानी होगी क्योंकि मुझे पता है कि मैंने इस तरह के झगड़े को प्रेरित किया होगा। आईएमओ, सही काम करने के लिए बच्चे को पूरा होने तक इंतजार करना है।

{ sh -c "$executable > $log 2>&1 &"' 
echo $! > pidfile 
echo # Alert parent that the pidfile has been written 
wait $! 
echo $? > exit-status 
' & } | read 
+0

धन्यवाद एक बहुत: चूंकि कि अस्वीकार्य है, यहाँ एक समाधान है कि पढ़ने पर ब्लॉक जब तक पीआईडी ​​फ़ाइल बजाय पाशन नींद करने का मौजूद है। वह बहुत करीब है। मुझे डर है कि मैंने एक और आवश्यकता छोड़ दी। बैश स्क्रिप्ट खत्म होना चाहिए। यदि मैं बैकग्राउंड हेल्पर स्क्रिप्ट में "$ $ pid; echo $? >> $ log" चलाता हूं, तो मुझे "बच्चे नहीं" त्रुटि मिल जाएगी। –

+2

यदि आप बच्चे को समाप्त होने से पहले स्क्रिप्ट से बाहर निकलना चाहते हैं, तो किसी प्रकार की अस्थायी विसंगति के बिना बच्चे के निकास कोड को लिखना संभव नहीं है। –

+0

उप-शेल कोष्ठक में संपूर्ण 'sh -c "($ निष्पादन योग्य"' निकास-स्थिति) 'और 'लपेटें। इससे सबस्केल अपने जीवन के साथ मिल जाता है जबकि माता-पिता को जो कुछ भी करने की ज़रूरत होती है, उसके साथ मिलती है। आप '' 'के बाद एक और '&' जोड़ना चाहेंगे। –

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