При использовании метода child_process.spawn () с {stdio: 'наследовать'} возможно ли, чтобы родитель получал выходные данные от дочернего процесса? - PullRequest
0 голосов
/ 05 февраля 2019

Я попытался прочитать subprocess.stdout, но в документах узла четко указано: «Если дочерний элемент был порожден с stdio [1], для которого установлено значение, отличное от« pipe », то это будет нулевым».это не то, что я хочу, потому что мне нужно наследовать.

Также пытался использовать process.send () в моем дочернем процессе, но это тоже не сработало.

Вот мой код, кстати:

const {spawn} = require('child_process');

const child = spawn('node index.js', {
    shell: process.env.ComSpec, 
    stdio: 'inherit'
});

1 Ответ

0 голосов
/ 05 февраля 2019

Да, вы можете найти ответ в документе Node.js здесь .

Если вы запускаете это в Windows, прочитайте этот раздел , вам нужно убедиться, что дочерний процесс выполняется в терминале (cmd.exe в Windows).

Вы должны иметь возможность использовать:

const child = spawn('node index.js', ['/c', 'my.bat']);

ИЛИ

exec('node index.js', (err, stdout, stderr) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(stdout);
});

В основном вызов " spawn (...) " вернет ChildProcess, который EvenEmitter .Он имеет два выходных потока: « stderr », « stdout », которые вы будете прослушивать для событий «data».

  • Вы прочитали ошибкувывод из порожденного (дочернего) процесса в потоке " stderr ".
  • Нормальный вывод из порожденного (дочернего) процесса выполняется в потоке " stdout ".

Как прослушивать нормальный вывод и ошибку:

child.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

child.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

Чтобы узнать, когда существовал дочерний процесс, прослушайте событие " close "

child.on('close', (code) => {
  // Perform cleanup.
});
...