2011-07-26 8 views
7

ls:नामित पाइप स्क्रिप्ट में समय से पहले बंद हो रहा है?

prwx------ 1 root root 0 fifo 

write.sh:

#! /bin/bash 
while true; 
do 
    echo "blah" > fifo 
done 

read.sh:

#! /bin/bash 
while true; 
do 
    cat fifo 
done 

मैं दो टर्मिनलों खुला है, एक write.sh चल रहा है और एक और read.sh चल रहा है। जब मैं पहले write.sh शुरू करता हूं, तो यह लटकता है (जैसा कि इसे करना चाहिए)। फिर मैं दूसरे टर्मिनल पर जाता हूं और read.sh शुरू करता हूं और यह "blah" को कई बार प्रिंट करता है, फिर मेरा write.sh स्टॉप हो जाता है। मेरी लेखन स्क्रिप्ट क्यों रोक रही है? यह एक छोटा सा परीक्षण है जो मैं पाइप को थोड़ा बेहतर समझने और समझने के लिए कर रहा हूं क्योंकि मैं अपने सभी लॉग एक पाइप पर भेज रहा हूं ताकि मैं उन्हें फाइल में लिखने से पहले पार्स कर सकूं।

मुझे यहां क्या याद आ रही है?

उत्तर

5

यहां दौड़ की स्थिति है। जो भी स्क्रिप्ट पहले अपने आंतरिक लूप कमांड को निष्पादित करती है (क्रमशः बिल्ली और गूंज) ब्लॉक और अन्य स्क्रिप्ट को इसके आंतरिक लूप कमांड को निष्पादित करने की प्रतीक्षा करेगी। हालांकि, स्क्रिप्ट सिंक्रनाइज़ करने के बाद, अगर बिल्ली अपने लिखने() को निष्पादित करने से पहले पाइप पर बंद() को कॉल करती है, तो गूंज एक सिगिपिप भेजा जाएगा और आपकी स्क्रिप्ट बाहर निकल जाएगी। आप एक पाइप को नहीं लिख सकते जो उसके पाठक द्वारा बंद कर दिया गया है।

यदि आप बिल्ली के साथ थोड़ी देर के लूप के बजाय अपने पाठक को tail -f में बदलते हैं, तो पाठक खुले होने के बजाय जीवित रहता है और पीएफओ को शाश्वतता में बंद कर देता है और आपको सिगिप नहीं मिलना चाहिए।

संदर्भ: man fifo

+0

बिल्कुल सही! धन्यवाद। – n0pe

5

गैर अवरुद्ध पाइपिंग व्यवहार तुम भी पहले पढ़ने फ़ाइल वर्णनकर्ता और फिर fifo पर एक लेख फ़ाइल वर्णनकर्ता खोल सकते प्राप्त करने के लिए।

# cf. https://stackoverflow.com/questions/2776994/tee-a-pipe-asynchronously 
(
rm -f fifo 
mkfifo fifo 
exec 3<fifo # open fifo for reading 
trap "exit" 1 2 3 15 
exec cat fifo | nl 
) & 
bpid=$! 

(
exec 3>fifo # open fifo for writing 
trap "exit" 1 2 3 15 
while true; 
do 
    echo "blah" > fifo 
done 
) 
#kill -TERM $bpid 

यह भी देखें: How do I use exec 3>myfifo in a script, and not have echo foo>&3 close the pipe?