我正在尝试从正在运行的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输出。 有什么建议吗?
答案 0 :(得分:0)
child_process.exec()
仅运行一次回调函数。如果您希望进程的stdout和stderr中的增量数据仍在运行时使用child_process.spawn()
并设置options.stdio
属性,以使进程的stdout和stderr可供父进程使用。
child_process.spawn()
会返回ChildProcess
个对象。要收集流程的输出,您可以为该对象的stdout
和stderr
流建立数据处理程序。您还应该为流程启动失败时触发的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_options和https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_class_childprocess
的Node.js文档中