首页 > 解决方案 > 执行错误:错误:如果在节点 js 上使用 child_process,则超出标准输出 maxBuffer

问题描述

我想在 Linux 上使用topwith不断地从监控进程和系统资源使用情况中获取数据child_process.exec

代码 :

const { exec } = require('child_process');
exec('top', (error, stdout, stderr) => {
    if (error) {
        console.error(`exec error: ${error}`);
        return;
    }
    console.log('stdout', stdout);
    console.log('stderr', stderr);
});

如果我运行上面的代码,我会得到一个错误exec error: Error: stdout maxBuffer exceeded

我正在使用 Node.js 版本 v8.9.4

top是否可以使用命令从命令中连续获取数据child_process.exec

标签: node.jslinux

解决方案


exec()会缓冲stdout

生成一个 shell,然后在该 shell 中执行命令,缓冲任何生成的输出。

来自文档。

top在没有进一步参数的情况下启动时,它会尝试重绘终端的某些部分。我不知道你来了这么远。在我的系统上,您的代码失败并显示:

顶部: tty 获取失败

您需要告诉top以批处理模式运行,以便每次更新时它都会完全转储其当前状态。

exec('/usr/bin/top -b', ...);

尽管由于top无限期地转储状态,但缓冲区最终仍会溢出。-n #您可以使用开关限制更新次数或使用spawn()

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

// Note: -b for batch mode and -n # for number of updates
let child = spawn("/usr/bin/top", ["-b", "-n", "2"]);

// Listen for outputs
child.stdout.on("data", (data) => {
    console.log(`${data}`);
});

使用data子进程流上的侦听器,stdout您可以及时观察数据。


推荐阅读