【问题标题】:Error: write EPIPE when piping node output to "| head"错误:管道节点输出到“| head”时写入 EPIPE
【发布时间】:2012-09-02 00:41:09
【问题描述】:

我遇到了错误:

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 上运行。有什么问题?

【问题讨论】:

    标签: node.js stdout


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      head 命令只读取前几行。您的代码希望读取其所有输出,如果无法生成输出,则会触发错误。如果丢弃程序的输出是合法的,请不要将其视为程序中的致命错误。如果丢弃程序的输出是不合法的,请不要通过管道将其发送到head

      您当前有一个竞争条件。如果head 在程序完成写入其输出之前开始忽略输入,则程序会出现异常。如果程序在head 开始忽略其输入之前完成了输出写入,那么一切都很好。

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

      【讨论】:

      • 查看我对答案的更新。这是一个竞赛条件。您有两件事完全不同步(head 关闭其输入和 test.js 完成其输出),其行为因先发生而异。
      • 谢谢,很有道理
      • 这在脚本语言中很常见吗? node.js 中的 console.log 是异步的吗,这和这个有什么关系吗?
      • @DavidSchwartz 关于“您的代码希望读取其所有输出并在无法产生输出时触发错误” - 为什么程序有责任辨别其他人如何读取其输出?意思是,为什么应该发生错误?在我看来,只要程序正确输出了所有信息,那么其他人如何阅读它完全是他们关心的问题。
      • @aaaaaa 程序员可以做出这样的选择并忽略与写入输出相关的所有错误。但是这个特定的程序没有做出这样的选择。该程序将无法写入输出视为致命错误。
      【解决方案3】:

      它对我有用,我试图将我的代码上传到 aws ec2 但我遇到了这个错误(错误:写 EPIPE) (npm uninstall phantomjs-prebuilt) 并再次安装 (npm install phantomjs-prebuilt@2.1.13

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      相关资源
      最近更新 更多