【问题标题】:Capturing the *complete* output stream of a child_process in NodeJS在 NodeJS 中捕获 child_process 的 *complete* 输出流
【发布时间】:2022-01-17 08:11:28
【问题描述】:

一段时间以来,我一直在尝试捕获 child_process 的输出。以下代码示例是我目前的尝试。

代码:

// Spawning a shell
var terminal = require('child_process').spawn(`sh`, [], { stdio: [ 'inherit', 'pipe', 'inherit'] });
console.log("Shell spawned!");

terminal.stdout.on('data', (data) => {
  console.log(`Received chunk ${data}`);
});

输出:

贝壳生成了!

预期输出:

贝壳生成了!

$

在标准输出选项上使用“继承”而不是“管道”时,我得到了预期的输出。但由于我需要捕获进程/shell 的输出,所以“继承”对我没有用。我现在的问题是,如何捕获进程的标准输出流的整个输出以及“继承”到底在做什么?我试图在使用“继承”后捕获 process.stdout - 显然没有运气。

【问题讨论】:

  • 您在子进程中启动新外壳是否有原因?您实际上是在子进程中分叉另一个进程。
  • 你看到this answer了吗?它是否回答了您关于继承与管道的问题?
  • @kevintechie 我这样做的原因是检查如果我的 child_process 中的另一个进程产生了,我是否可以重定向输出。我已经尝试过“shell:true”这个论点,这基本上就是我在这里所做的。

标签: node.js stdout stdin child-process stdio


【解决方案1】:

无法从子进程 shell 显示提示,因为 bash(我假设其他 shell)不会将提示输出到标准输出。详情请见this post。

您可以通过写入标准输出而不是 console.log() 来模拟它。

const term = require('child_process')
  .spawn('sh', [], { stdio: [ 'inherit', 'pipe', 'pipe'] });

process.stdout.write('$ ');

term.stdout.on('data', (data) => {
  process.stdout.write(`\n${data}$ `);
});

term.stderr.on('data', (data) => {
  process.stderr.write(`\n${data}$ `);
});

【讨论】:

  • 我刚刚找到了node-pty module,它可能会为您提供所需的内容。
  • 您链接的帖子部分回答了我的问题。我还注意到在将 stderr 设置为继承后显示了提示。 node-pty 模块可能是我的问题的解决方案,我会试一试并及时更新。
  • 我遇到的另一个问题是,如果您在 shell 中生成另一个进程,例如,如果您使用“mysql -uroot -ptoor”生成一个 mysql shell,则输出再次丢失。您仍然可以输入诸如“退出”之类的命令,然后您又回到了 shell 中——尽管在 mysql shell 中执行命令时不会得到任何输出。
  • 请阅读我在评论中链接到的那篇文章,以回答您关于继承与管道的问题。它解释了正在发生的事情。使用继承将标准输入、标准输出和标准错误连接到子进程本质上告诉 bash 你有一个交互式终端,它将切换发送输出到 dev/try 流。
  • 因为您的要求是您必须捕获子进程的输出,所以您必须使用管道,它基本上将您的子进程与父进程隔离,因此它不知道您有一个交互式终端附上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 2021-09-08
  • 1970-01-01
相关资源
最近更新 更多