【问题标题】:Node.js intercept output of another processNode.js 拦截另一个进程的输出
【发布时间】:2018-06-01 13:57:59
【问题描述】:

我正在尝试从正在运行的 Node.js 进程启动一些进程。 问题是,这些必须从脚本启动,并像这样使用 exec:

exec("./scripts/run.sh",(err, stdout, stderr)  => {
if (err) {
  console.error(err);
  return;
}
  this.logs = this.logs.unshift(timestamp() + stdout);
  this.errorlogs = this.logs.unshift(timestamp() + stderr);
});

不重定向我需要的输出。 Fork 似乎仅适用于 Node.js 进程,而这些进程并非如此。

这些进程工作得很好,并且作为主进程的子进程起作用。我只需要实际获得标准输出和标准错误输出。 有什么建议吗?

【问题讨论】:

  • 试试stderr.on( 'data', console.log )stdout.on( 'data', console.log )?
  • 似乎没有输出任何东西。不过谢谢!

标签: javascript node.js child-process


【解决方案1】:

child_process.exec() 只运行一次回调函数,在执行的进程终止后。如果您希望在进程仍在运行时从进程的标准输出和标准错误中获取增量数据,请使用child_process.spawn() 并设置options.stdio 属性以使进程的标准输出和标准错误对父进程可用。

child_process.spawn() 返回一个ChildProcess 对象。要收集进程的输出,您可以为该对象的stdoutstderr 流建立数据处理程序。您还应该为在进程启动失败时触发的error 事件以及在这些流关闭且进程终止时触发的close 事件建立处理程序。

它看起来像这样:

  child = spawn("./scripts/run.sh", 
                [],
                {stdio: ['ignore', 'pipe', 'pipe']});

  child.on('error', (err) => }
      console.log('child launch failed: ', err);
  });

  child.on('close', (code) => {
      console.log('child ended: ', code);
  });

  child.stdout.on('data', (outdata) => {
      this.logs = this.logs.unshift(timestamp() + outdata);
  });

  child.stderr.on('data', (errdata) => {
      this.errorlogs = this.logs.unshift(timestamp() + errdata);
  });

血淋淋的细节在 https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_child_process_spawn_command_args_optionshttps://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_class_childprocess 的 Node.js 文档中

【讨论】:

  • 这正是我所需要的,谢谢!有趣的是,此方法将 this.logs 转换为非数组。但它是一个指针,因此它可以在没有 this.logs = this.logs 的情况下工作。 ......无论如何。
猜你喜欢
  • 2010-09-19
  • 2014-07-04
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2010-11-08
相关资源
最近更新 更多