gpt4 book ai didi

javascript - Node.js:捕获 `child_process.spawn` 的 STDOUT

转载 作者:数据小太阳 更新时间:2023-10-29 04:33:29 30 4
gpt4 key购买 nike

我需要在生成的子进程的自定义 输出中捕获。

child_process.spawn(command[, args][, options])

例如,

var s = fs.createWriteStream('/tmp/test.txt');
child_process.spawn('ifconfig', [], {stdio: [null, s, null]})

现在如何实时读取 /tmp/test.txt

看起来 child_process.spawn 没有使用 stream.Writable.prototype.write 也没有使用 stream.Writable.prototype._write执行。

例如,

s.write = function() { console.log("this will never get printed"); };

还有,

s.__proto__._write = function() { console.log("this will never get printed"); };

看起来它使用文件描述符在幕后child_process.spawn 写入文件。

这样做是行不通的:

var s2 = fs.createReadStream('/tmp/test.txt');
s2.on("data", function() { console.log("this will never get printed either"); });

那么,如何获取子进程的 STDOUT 内容呢?

我想要实现的是将子进程的 STDOUT 流式传输到套接字。如果我将套接字作为 stdio 参数直接提供给 child_process.spawn,它会在完成时关闭套接字,但我想让它保持打开状态。

更新:

解决方案是使用默认的 {stdio: ['pipe', 'pipe', 'pipe']} 选项并监听创建的 .stdout子进程。

var cmd = child_process.spaw('ifconfig');
cmd.stdout.on("data", (data) => { ... });

现在,提高赌注,一个更具挑战性的问题:

-- 如何读取子进程的 STDOUT 并仍然保留颜色?

例如,如果您像这样将 STDOUT 发送到 process.stdout:

child_process.spawn('ifconfig', [], {stdio: [null, process.stdout, null]});

它将保留颜色并将彩色输出打印到控制台,因为 .isTTY 属性在 process.stdout 上设置为 true .

process.stdout.isTTY // true

现在,如果您使用默认的 {stdio: ['pipe', 'pipe', 'pipe']},您将读取的数据将被去除控制台颜色。你如何获得颜色?

一种方法是使用 fs.createWriteStream 创建您自己的自定义流,因为 child_process.spawn 要求您的流具有文件描述符。

然后将该流的 .isTTY 设置为 true,以保留颜色。

最后,您需要捕获 child_process.spawn 写入该流的数据,但由于 child_process.spawn 不使用 .prototype.write 或流的 .prototype._write,您需要以其他一些hacky 方式捕获其内容。

这可能就是为什么 child_process.spawn 要求您的流具有文件描述符的原因,因为它绕过了 .prototype.write 调用并直接写入文件 -引擎盖

有什么想法可以实现吗?

最佳答案

你可以在不使用临时文件的情况下做到这一点:

var process = child_process.spawn(command[, args][, options]);
process.stdout.on('data', function (chunk) {
console.log(chunk);
});

关于javascript - Node.js:捕获 `child_process.spawn` 的 STDOUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30616749/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com