2012-09-08 54 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得到错误,这似乎出现在约70%运行在Ubuntu 12.04。有什么问题?

回答

15

head命令只读取前几行。您的代码预计会读取其所有输出,并在其无法生成输出时触发错误。如果从程序中丢弃输出是合法的,请不要将其视为程序中的致命错误。如果抛弃程序的输出是不合法的,请不要将其输出到head

您目前有一个竞赛条件。如果head在程序完成写入输出之前开始忽略输入,则程序会发生异常。如果程序在head开始忽略输入之前完成写入输出,则一切正常。

作为一个愚蠢的临时的解决办法:node test.js | tee /dev/null | head
现在,tee将采取所有程序的输出。

+2

看到我更新了答案。这是一个竞赛条件。你有两件事情是完全不同步的('head'关闭它的输入,'test.js'完成它的输出),行为根据哪个行为先发生变化。 –

+0

谢谢,这很有道理 – Fluffy

+1

优秀的分析。 –

18

要改变计划,在一个封闭的管道的情况下顺利退出,尝试:

process.stdout.on('error', function(err) { 
    if (err.code == "EPIPE") { 
     process.exit(0); 
    } 
});