我正在尝试从一个正在运行的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输出。有什么建议吗?
发布于 2018-06-02 08:41:22
child_process.exec()
仅在执行进程终止后运行回调函数一次。如果希望在进程仍在运行时从进程的标准输出和标准错误中获得增量数据,请使用child_process.spawn()
并设置options.stdio
属性,使进程的标准输出和标准错误可供父进程使用。
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);
});
血淋淋的细节在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文档中
https://stackoverflow.com/questions/50645084
复制相似问题