首页 > 解决方案 > 当使用带有 {stdio: 'inherit'} 的 child_process.spawn() 方法时,父进程是否可以从子进程接收输出?

问题描述

我试过阅读 subprocess.stdout 但节点文档清楚地指出“如果孩子是在 stdio[1] 设置为'管道'以外的任何东西的情况下产生的,那么这将是空的。” 这不是我想要的,因为我需要继承。

还尝试在我的子进程中使用 process.send() ,但这也不起作用。

这是我的代码顺便说一句:

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

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

标签: javascriptnode.jsipcchild-process

解决方案


是的,您可以在此处的 Node.js 文档中找到答案。

如果您在 Windows 上运行它,请阅读本节,您将需要确保子进程在终端中运行(Windows 上的 cmd.exe)。

您应该能够使用:

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 ”,您将在它们上监听“数据”事件。

  • 您从“ 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.
});

推荐阅读