Node.js перехватывает вывод другого процесса - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь запустить несколько процессов из запущенного процесса 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);
});

Не перенаправляет вывод, который мне нужен.Кажется, что форк предназначен только для процессов Node.js.

Процессы работают нормально и функционируют как дочерние процессы основного процесса.Мне просто нужно получить выходные данные stdout и stderr.Есть предложения?

1 Ответ

0 голосов
/ 02 июня 2018

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

...