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);
});
Подробности в документах Node.js: 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