2012-09-08 9 views
18

मैं त्रुटि हो रही है साथ समस्या हो रही हूँ:त्रुटि: करने के लिए नोड उत्पादन पाइप EPIPE लिखने "| सिर"

events.js:48 
     throw arguments[1]; // Unhandled 'error' event 
        ^
Error: write EPIPE 
    at errnoException (net.js:670:11) 
    at Object.afterWrite [as oncomplete] (net.js:503:19) 

जब सिर करने के लिए उत्पादन पाइप। इसे आज़माने के लिए एक साधारण मामला है:

console.log('some string'); 
... the same for 20 lines 

और फिर node test.js | head त्रुटि है, जो Ubuntu 12.04 पर लगभग 70% रन में प्रदर्शित करने लगता है पाने के लिए। समस्या क्या है?

उत्तर

15

head कमांड केवल कुछ ही पंक्तियों को पढ़ता है। आपका कोड उम्मीद करता है कि इसके सभी आउटपुट को पढ़ा जाए और अगर यह उत्पादन नहीं कर पाता है तो एक त्रुटि ट्रिगर करता है। यदि आपके प्रोग्राम से आउटपुट फेंकना कानूनी है, तो प्रोग्राम में घातक त्रुटि के रूप में इसका इलाज न करें। यदि आपके प्रोग्राम से आउटपुट को फेंकना कानूनी नहीं है, तो इसे head पर पाइप न करें।

आपके पास वर्तमान में दौड़ की स्थिति है। यदि head प्रोग्राम को आउटपुट लिखने से पहले इनपुट को अनदेखा करना शुरू करता है, तो प्रोग्राम को अपवाद मिलता है। यदि प्रोग्राम head से पहले अपने आउटपुट को लिखना समाप्त कर देता है तो इसके इनपुट को अनदेखा करना शुरू होता है, सब कुछ ठीक है।

एक मूर्खतापूर्ण अस्थायी ठीक के रूप में: node test.js | tee /dev/null | head
अब, tee सभी कार्यक्रम के उत्पादन का समय लगेगा।

+2

जवाब देने के लिए मेरे अद्यतन देखें। यह दौड़ की स्थिति है। आपके पास दो चीजें हैं जो पूरी तरह से अनसंक्रनाइज़ हैं ('हेड' अपने इनपुट को बंद कर रही है और 'test.js' अपने आउटपुट को खत्म कर रही है) व्यवहार के साथ जो पहले होता है, उसके आधार पर भिन्न होता है। –

+0

धन्यवाद, यह सही मायने रखता है – Fluffy

+1

उत्कृष्ट विश्लेषण। –

18

कार्यक्रम एक बंद पाइप के मामले में सफलतापूर्वक बाहर निकलने के लिए बदलने के लिए, कोशिश:

process.stdout.on('error', function(err) { 
    if (err.code == "EPIPE") { 
     process.exit(0); 
    } 
}); 
संबंधित मुद्दे