【问题标题】:NodeJS: How to read stdout and stderr of a child process spawned by an explicitly spawned process?NodeJS:如何读取由显式生成的进程生成的子进程的标准输出和标准错误?
【发布时间】:2019-02-10 14:59:34
【问题描述】:

我最近一直在开发按需构建服务器。构建服务器是一个 NodeJS/Express REST API,它本质上包装了 Angular CLI 和相关的构建工具,用于完成自定义的按需 Angular 应用程序。

一切都按预期端到端运行,但我希望能够更详细地处理状态报告,因为 Angular 构建在考虑到流程的 2 个非常大的部分时可能会非常耗时

流程中运行时间最长的两个部分:

  1. npm install(通常通过默认 @angular/schematics 集合中的 ng-new 原理图自动启动)
  2. 实际的ng build 命令。

2 很容易解决,因为我直接通过 child_process.spawn() 生成该进程 (ng build --prod)。

1 已经证明有点复杂,因为长时间运行的npm install 进程实际上是在内部启动到默认的 Angular ng-new 示意图/命令。所以,如果我的想法是正确的,这本质上是一个显式产生的子进程(我产生的ng new),它在内部产生npm install

我想出的一个解决方法是将--skip-install arg 传递给ng new,这将防止内部npm install 进程被原理图启动。通过这样做,我可以通过child_process.spawn() 手动启动npm install 并直接观察stdout 和stderr 流。

我很好奇是否有人知道从我明确生成的ng new 命令中启动的“npm install”中监视 stderr 和 stdout 流的方法?

谢谢!

【问题讨论】:

    标签: node.js stdout child-process stderr spawn


    【解决方案1】:

    如果您在 Linux 上运行,则可以使用 strace 监视另一个进程的输出。

    strace -p7835 -e trace= -e write=3
    

    请参阅this answer 了解更多详情。

    您当然可以从节点调用strace,使用spawn。要找到npm 进程的pid(实际上是node 进程btw),您需要使用ps 命令获取进程树。已经有一个节点模块可以做到这一点:ps-tree,它似乎也是跨平台的。

    有关 Windows 上 strace 的替代品,请查看 this discussion。我会选择 Sysinternals 的 Process Monitor

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 2019-10-17
      • 1970-01-01
      • 2011-05-19
      • 2011-08-31
      • 1970-01-01
      • 2020-08-27
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多