错误:当管道节点输出到"| head"时写入EPIPE

Flu*_*ffy 21 stdout node.js

我遇到错误时遇到问题:

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)
Run Code Online (Sandbox Code Playgroud)

当输出到头部时.试一试的一个简单案例是:

console.log('some string');
... the same for 20 lines
Run Code Online (Sandbox Code Playgroud)

然后node test.js | head得到错误,这似乎出现在Ubuntu 12.04上大约70%的运行.有什么问题?

Dav*_*rtz 18

head命令仅读取前几行.您的代码需要读取其所有输出,如果无法生成输出,则会触发错误.如果从程序中丢弃输出是合法的,请不要将其视为程序中的致命错误.如果从程序中丢弃输出是不合法的,请不要将其输出head.

你目前有竞争条件.如果head在程序完成写入输出之前开始忽略输入,程序将获得异常.如果程序在head开始忽略其输入之前完成写入输出,一切都很好.

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

  • 请参阅我对答案的更新.这是竞争条件.你有两件完全不同步的东西(`head`关闭它的输入和'test.js`完成它的输出)的行为根据首先发生的变化而变化. (2认同)

Jim*_*Jim 18

要在关闭管道的情况下将程序更改为成功退出,请尝试:

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