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

时间:2018-09-05 12:48:58

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

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

一切工作都将以预期的方式进行,但是我希望能够通过状态报告获得更详细的信息,因为将过程的两个非常大的部分考虑在内时,Angular构建会非常耗时

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

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

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

1已经证明有点复杂,因为长时间运行的npm install过程实际上是在默认Angular ng-new原理图/命令的内部开始的。因此,如果我的想法是正确的,那么这实质上是一个显式产生的子进程(我产生的ng new),该进程内部产生了npm install

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

有关更多详细信息,请参见this answer

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

有关Windows上strace的替代方法,请选中this discussion。我会去Sysinternals申请Process Monitor