【问题标题】:Catching process termination when piped管道时捕获进程终止
【发布时间】:2015-01-19 21:27:15
【问题描述】:

我有一个永远运行的节点 CLI 程序,它应该在进程终止之前打印一个摘要。我已注册这些事件以在终止前采取行动:

process.on("exit", end);
process.on("SIGINT", end);
process.on("SIGQUIT", end);
process.on("SIGTERM", end);

以上回调在以node app 启动时运行,但当进程像node app | tee file 那样通过管道传输时不会运行,在这种情况下,我不会收到 SIGINT,exit 回调也不会运行。有什么建议吗?

【问题讨论】:

  • 它对我有用(exit 事件)。我在 Linux 上的节点 v0.10.31 上进行了测试。您正在尝试使用哪个节点版本?
  • 我在节点 v0.10.35 上,程序被 SIGINT 中断,如果这很重要的话。
  • 对我来说发生在 Linux 和 OS X 上。如果你想检查一下:npm install -g tcpie && tcpie google.com | tee /dev/null 然后 SIGINT 。
  • 有趣的是,当使用kill -s SIGINT pid 停止它时它的行为是正确的,它只是 CTRL-C,它似乎不会在管道时触发任何一个事件。
  • 我现在确定回调会被调用,但由于 stdout 仍在管道中,我打印的输出永远不会到达终端。打印到 stderr 确实有效,但这是一个丑陋的 hack。

标签: node.js unix process pipe


【解决方案1】:

通过检查process.stdout._type === "pipe" 解决了这个问题,在这种情况下,我输出到stderr 而不是stdout。不是一个很好的解决方案,但它可以满足我的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2012-01-27
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多