NodeJS execSync 与自定义标准输出流,用于收集输出并即时记录到终端

Posted

技术标签:

【中文标题】NodeJS execSync 与自定义标准输出流,用于收集输出并即时记录到终端【英文标题】:NodeJS execSync with custom stdout stream for collecting output and logging to terminal on the fly 【发布时间】:2019-01-25 14:25:56 【问题描述】:

当您使用 execSync 时,您可以指定 stdio:

https://nodejs.org/api/child_process.html#child_process_options_stdio

第五个说你可以传递一个 Stream 对象:

    对象 - 共享引用 tty、文件、套接字或带有子进程的管道。流的 底层文件描述符在子进程中复制到 fd 对应于 stdio 数组中的索引。请注意, 流必须有一个底层描述符(文件流直到 'open' 事件已发生)。

但是,我无法传递对象。我试过了:

const  PassThrough, Writable  = require('stream');
const pass     = new PassThrough();

我在这里找到的:

https://nodejs.org/api/stream.html#stream_three_states

但我无法将其作为 stdio: [..., stdout, ...] 传递给 execSync 选项方法调用。

require('child_process').execSync(command, options);

有人吗?

【问题讨论】:

你解决了吗? 类似,但我从未实现过。唯一的方法基本上是异步执行,在下面等待,写入文件,然后从中读取并记录。 【参考方案1】:

正如它所说 -

引用 tty、文件、套接字或 与子进程的管道

因此,您不能使用任何您喜欢的流。然而,我不知道根本原因。下面是如何使用 fs.createWriteStream 使其工作。注意 'open' 事件 - 这似乎很重要,如果在调用 childProcess.exec 之前不等待该事件,您将收到错误。

const fs = require('fs')
const childProcess = require('child_process')

const stream = new fs.createWriteStream('out')
stream.on('open', function() 
    childProcess.execSync('ls -la', stdio:['ignore', stream, stream])
)

您也可以将文件描述符传递给 stdio 数组条目。我个人还缺少的是传递任何类型的流的可能性,尤其是允许将输出发送到多个接收器的“直通”流。如前所述,我不知道为什么会这样-可能有充分的理由。希望其他人可以提供更多详细信息。

【讨论】:

以上是关于NodeJS execSync 与自定义标准输出流,用于收集输出并即时记录到终端的主要内容,如果未能解决你的问题,请参考以下文章

C/C++编程笔记:C++中的标准输入流 & 标准输出流

在 sklearn 中将 Pipeline 与自定义类一起使用

Nodejs学习笔记----- Stream

捕获 execSync 错误

注销凭证与自定义屏幕

async.waterfall 和 child_process.execSync 有啥区别?