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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (70)

我试图从正在运行的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输出。有什么建议么?

提问于
用户回答回答于

child_process.exec()只有在exec'ed进程终止后才运行回调函数。如果您希望进程的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);
  });

扫码关注云+社区

领取腾讯云代金券