मैं टूटी हुई पाइप त्रुटि को कैसे ठीक कर सकता हूं?


36

जब मैंने SSD ड्राइव प्राप्त किया, तो उबंटू 12.10 की एक नई स्थापना के बाद मैंने हाल ही में RVM ( http://rvm.io पर निर्देशों का पालन करते हुए ) को फिर से इंस्टॉल किया।

अब, जब मैं टाइप करता हूं: type rvm | head -1

मुझे निम्नलिखित त्रुटि प्राप्त हुई:

rvm is a function
-bash: type: write error: Broken pipe

लेकिन अगर मैं तुरंत कमान दोहराता हूं तो मुझे केवल यह प्राप्त होता है:

rvm is a function

और ऐसा लगता है कि सब कुछ ठीक है? क्या हो रहा है? इसे ठीक करने के लिए मुझे क्या करना होगा? यह हमेशा नहीं होता है। यह अधिक छिटपुट प्रतीत होता है। मैं इसे करने के लिए पैटर्न के कुछ प्रकार को खोजने की कोशिश की है, लेकिन अभी तक नहीं किया है।

जवाबों:


57

इस स्थिति में "टूटा हुआ पाइप" देखना दुर्लभ है, लेकिन सामान्य है।

जब आप चलाते हैं type rvm | head -1, तो बैश type rvmएक प्रक्रिया में, head -1दूसरे में निष्पादित होता है । 1 स्टडआउट typeएक पाइप के "राइट" छोर से जुड़ा हुआ है , head"रीड" एंड का स्टड है । दोनों प्रक्रियाएं एक ही समय में चलती हैं।

head -1प्रक्रिया stdin से (आम तौर पर 8 kB की मात्रा में) डेटा, (के अनुसार एक ही पंक्ति बाहर प्रिंट पढ़ता -1विकल्प), और बाहर निकलता है, जिससे पाइप के "पढ़ें" अंत को बंद करना पड़ा। चूंकि rvmफ़ंक्शन काफी लंबा है (बैश द्वारा पार्स और पुनर्निर्मित किए जाने के बाद लगभग 11 केबी), इसका मतलब यह है कि headबाहर निकलता है जबकि typeअभी भी कुछ केबी को बाहर लिखने के लिए डेटा है।

इस बिंदु पर, चूंकि typeएक पाइप को लिखने की कोशिश की जा रही है , जिसका दूसरा छोर बंद हो गया है - एक टूटी हुई पाइप - यह () फ़ंक्शन को शांत करता है जो ईपीआईपीई त्रुटि लौटाएगा, जिसका अनुवाद "ब्रोकन पाइप" के रूप में किया जाएगा। इस त्रुटि के अलावा, कर्नेल SIGPIPE सिग्नल को भी भेजता है type, जो डिफ़ॉल्ट रूप से प्रक्रिया को तुरंत मारता है।

(संवादात्मक गोले में संकेत बहुत उपयोगी है, क्योंकि अधिकांश उपयोगकर्ता नहीं चाहते हैं कि पहली प्रक्रिया चलती रहे और कहीं भी लिखने की कोशिश न करें। इस बीच, गैर-संवादात्मक सेवाएं SIGPIPE को अनदेखा करती हैं - यह लंबे समय तक चलने वाले डेमॉन के लिए अच्छा नहीं होगा। इतनी सरल त्रुटि पर मरना - तो वे त्रुटि कोड को बहुत उपयोगी पाते हैं।)

हालांकि, सिग्नल डिलीवरी 100% तत्काल नहीं है, और ऐसे मामले भी हो सकते हैं जहां ईपीआईपीई लिखते हैं और सिग्नल प्राप्त करने से पहले थोड़ी देर के लिए प्रक्रिया जारी रहती है। इस मामले में, typeअसफल लेखन को नोटिस करने के लिए पर्याप्त समय मिलता है, त्रुटि कोड का अनुवाद करें और यहां तक ​​कि एसआईजीपीआईपीई द्वारा मारे जाने से पहले एक त्रुटि संदेश भी स्टेंडर को प्रिंट करें। (त्रुटि संदेश "-बैश: प्रकार:" कहता है, क्योंकि typeअपने आप ही बाश का एक अंतर्निहित कमांड है।)

मल्टी-सीपीयू सिस्टम पर यह अधिक सामान्य प्रतीत होता है, क्योंकि typeप्रक्रिया और कर्नेल का सिग्नल डिलीवरी कोड अलग-अलग कोर पर, शाब्दिक रूप से एक ही समय में चल सकता है।

typeजब यह राइट () फ़ंक्शन से ईपीआईपीई प्राप्त करता है, तो इस संदेश को बिलिन (बैश के स्रोत कोड) में तुरंत पैच करके निकालना संभव होगा ।

हालाँकि, इसके बारे में चिंतित होने के लिए कुछ भी नहीं है, और यह rvmकिसी भी तरह से आपकी स्थापना से संबंधित नहीं है ।


धन्यवाद! मुझे इसकी चिंता थी। मैंने बीती रात करीब एक घंटे की गुगली की, अपने rvm को स्थापित करने और इसे ठीक करने के लिए मरम्मत करने की समस्या का निवारण किया। मैं बस एक SSD ड्राइव के साथ स्वैप किया गया था और LVM का उपयोग किया था और हार्ड ड्राइव को एन्क्रिप्ट किया था ताकि बहुत सारे वैरिएबल प्ले में आ जाएं और मुझे यकीन नहीं था कि शायद फुटपाथ चला गया था। मेरे मन को आराम से रखने के लिए धन्यवाद!
जेसन शुल्टज

मैं वर्षों lsसे आउटपुट को head -1पाइप कर रहा हूं, और आज मुझे एक टूटा हुआ पाइप संदेश मिल रहा है।
ट्यूलेंस कोरडोवा

1
(नोट: "टूटी हुई पाइप" त्रुटि सिग्नल से नहीं आती है। यह इरनो से आती है । जबकि शेल अन्यथा सिग्नल-प्रेरित-निकास के लिए पाठ संदेश दिखा सकता है, यह आमतौर पर यह दिखाने के लिए पर्याप्त स्मार्ट है कि एक SIGPIPE निकास एक था 'स्वच्छ' एक।)
विशालता

23

आप किसी अन्य प्रक्रिया की कीमत पर टूटी पाइप कोtail -n +1 अपने पाइप में डालकर ठीक कर सकते हैं , जैसे:

प्रकार rvm | पूँछ -n +1 | सिर -1

+1बताता है tailइनपुट और सब कुछ है कि इस प्रकार की पहली पंक्ति मुद्रित करने के लिए। आउटपुट बिल्कुल वैसा ही होगा जैसा कि tail -n +1वहां नहीं था, लेकिन मानक आउटपुट की जांच करने के लिए कार्यक्रम काफी स्मार्ट है और पाइप को सफाई से बंद कर देता है। अधिक टूटे हुए पाइप नहीं


1
अच्छी चाल। मैंने यहां उपलब्ध कराए गए की तुलना में एक अलग स्थिति में उपयोग किया है। धन्यवाद!
कोई अभी भी आप का उपयोग करता है MS-DOS

6
एक महान समाधान की तरह लग रहा था, लेकिन Ubuntu 14.04.2 पर पूंछ 8.21 के साथ मुझे "पूंछ: राइट एरर: ब्रोकन पाइप" मिलता है, जो कोई सुधार नहीं है।
रोजर ड्यूक

2
@RogerDueck सही है। मैं यह भी एक मांडवी प्रणाली पर इसी तरह की समस्या के लिए find /var/lib/mysql -xdev -type f -daystart -mmin +5 -print0 | xargs -0 ls -ldt | tail -n +1 | headमज़बूती से पैदावार के लिए देखता हूं xargs: ls: terminated by signal 13। जैसा कि हम जानते हैं, समस्या इनपुट थकावट में से एक है और वास्तव में केवल एक ही कमांड है जो बफरिंग से संबंधित है: डी.डी. | dd obs=1Mपाइप लाइन को जोड़ने से मेरे उपयोग के मामले में SIGPIPE ठीक हो जाता है।
एंड्रयू बील्स

3
मैं अपने सुझाव में और संशोधन करूंगा, हालांकि मैं यह नोट करूंगा कि मुझे विश्वास नहीं है कि जिग्स या टाइप को SIGPIPE के बारे में बताया जाना चाहिए: type rvm | (head -1 ; dd of=/dev/null) यह, निश्चित रूप से, यह अन्य सुझावों के समान है क्योंकि यह सभी इनपुट के संसाधित होने का कारण है। , लेकिन ddऐसी चीजों को संभालने के लिए सबसे कुशल कार्यक्रम होना चाहिए।
एंड्रयू बील्स

3
यहाँ SIGPIPE उल्लंघनकर्ताओं पर टिप्पणी: mail-index.netbsd.org/tech-userlevel/2013/01/07/msg007110.html
एंड्रयू बील्स

2

write error: Broken pipeसंदेश एक लिखने की प्रक्रिया है कि कोई पाठकों कि पाइप और विशेष परिस्थिति है कि के पढ़ने अंत पर छोड़ दिया साथ एक पाइप के लिए लिखने के लिए कोशिश करता है को संदर्भित करता SIGPIPEसंकेत सेट किया गया है वर्तमान या माता पिता प्रक्रिया के द्वारा या तो ध्यान नहीं दिया जा करने के लिए। यदि यह माता-पिता की प्रक्रिया है जिसे SIGPIPEअनदेखा किया जाना तय है, तो बच्चे की प्रक्रिया को पूर्ववत खोल में फिर से खोलना संभव नहीं है।

हालांकि, यह मारने के लिए संभव है type rvmजब head -1स्पष्ट subshells का उपयोग करके समाप्त हो जाता है। इस तरह से हम पृष्ठभूमि कर सकते हैं type rvm, भेजने typepidके लिए head -1subshell पर एक जाल और फिर लागू EXITवहाँ मारने के लिए type rvmस्पष्ट रूप से।

trap "" PIPE        # parent process sets SIGPIPE to be ignored
bash                # start child process
export LANG=C
# create a fake rvm function
eval "
rvm() {
$(printf 'echo line of rvm code %s\n' {1..10000})
}
"

# rvm is a function
# bash: type: write error: Broken pipe
type rvm | head -1

# kill type rvm when head -1 terminates
# sleep 0: do nothing but with external command
( (sleep 0; type rvm) & echo ${!} ; wait ${!} ) | 
    (trap 'trap - EXIT; kill "$typepid"; exit' EXIT; typepid="$(head -1)"; head -1)

ग्रैविटी के उत्तर से: typeअसफल लेखन को नोटिस करने के लिए पर्याप्त समय मिलता है, त्रुटि कोड का अनुवाद करें और यहां तक ​​कि SIGPIPE द्वारा मारे जाने से पहले एक त्रुटि संदेश को stderr पर प्रिंट करें । मुझे लगता है कि आपका समाधान निर्माता की प्रक्रिया ( typeयहां) को असफल लेखन (बंद पाइप के कारण) से प्रतिक्रिया करने से नहीं रोकता है , क्या ऐसा होता है?
पायोत्र डोब्रोगोस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.