NodeJS:如何读取由显式生成的进程生成的子进程的stdout和stderr?



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

一切都按预期端到端工作,但我希望能够通过状态报告获得更精细的信息,因为在考虑流程的 2 个非常大的部分时,Angular 构建可能非常耗时

该过程运行时间最长的两个部分:

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

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

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

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

我很好奇是否有人知道一种方法可以从我明确生成的ng new命令中启动的"npm 安装"中监视 stderr 和 stdout 流?

谢谢!

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

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

有关更多详细信息,请参阅此答案。

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

有关 Windows 上strace的替代方案,请查看此讨论。我会选择Sysinternals的进程监视器。

最新更新