【问题标题】:increase maximum byte size of nodejs pipe增加nodejs管道的最大字节大小
【发布时间】:2016-01-06 02:09:02
【问题描述】:

我正在尝试编写一个小命令脚本来代理我项目中的其他脚本,并且我正在尝试使用节点将标准输出从生成的进程通过管道传输到当前进程的标准输出:

function runCommand(command, arguments) {
    var commandProcess = childProcess.spawn(command, arguments);
    commandProcess.stdout.pipe(process.stdout);
    commandProcess.on("exit", process.exit);
}

这工作正常,直到我开始从我的子进程中获得大量输出(例如,其中一个是 maven 命令)。我看到的是它只打印出标准输出的前 8192 个字节,然后将其余字节存储到下一个“数据”事件。然后它会打印出下一个 8192 等。这意味着输出存在延迟,有时当我们运行服务器进程时,它有时会停止打印输出,直到您在服务器上触发触发另一个“数据”事件的某些东西。

有没有办法增加这个缓冲区的大小或避免这种行为?理想情况下,这个指挥官脚本只是代理我们的其他脚本,并且应该按原样打印出所有内容。

【问题讨论】:

    标签: javascript node.js maven stream


    【解决方案1】:

    您正在使用异步异步的节点进程生成,因此它会在子进程给出标准输出时给出输出。 参考:[https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options][1]

    我建议使用子进程 exec 来运行您的进程,您可以在其中控制输出缓冲区的大小,这将在子进程完成后给出输出。这就是您传递缓冲区大小的方式

    var execute = function(command, callback){
        exec(command, {maxBuffer: 1024 * 500}, function(error, stdout, stderr){ callback(error, stdout); });
    };
    

    【讨论】:

    • 谢谢!我会看看这是否适合我的需要。我一开始没有尝试的原因是因为打印到stdout的数据量很大。理想情况下,我希望缓冲区大小为“无限”,并且只打印输出的内容,我认为这就是 .pipe 会做的事情。
    • 实际上我们不能使用exec,因为这是一个服务器命令(即一个在您手动告诉它之前不会退出的进程),我们实际上希望它是异步异步的。在我看来,spawned 进程的硬编码限制为 8192 字节,我需要一种解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2013-04-19
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多