Node.js拦截另一个进程的输出

时间:2018-06-01 13:58:00

标签: javascript node.js child-process

我正在尝试从正在运行的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进程,而这些进程并非如此。

这些流程工作得很好,并且可以作为主流程的子流程运行。我只需要实际获得stdout和stderr输出。 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

在exec' ed进程终止后,

child_process.exec()仅运行一次回调函数。如果您希望进程的stdout和stderr中的增量数据仍在运行时使用child_process.spawn()并设置options.stdio属性,以使进程的stdout和stderr可供父进程使用。

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);
  });

gory详细信息位于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文档中