首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >spawnSync /bin/sh

spawnSync /bin/sh
EN

Stack Overflow用户
提问于 2020-09-08 15:02:12
回答 3查看 7.8K关注 0票数 13

在执行以下行时,在我的NodeJs应用程序中非系统地生成"spawnSync /bin/ spawns “错误:

代码语言:javascript
运行
复制
child_process.execSync(`cd /tmp/myFolder ; tar -xjf myArchive.tar.bz2`);

存档维度为81.5MB,NodeJs版本为NVM : 12.17.0。

EN

回答 3

Stack Overflow用户

发布于 2020-09-08 15:02:12

问题是,execSync模式在shell中使用有限的缓冲区(200 Kb)执行命令,该缓冲区用于转发执行输出。此外,默认的shell执行选项是“管道”,这意味着输出必须转发给父程序。

为了让shell忽略执行输出,即转发到/dev/null输出,从而防止缓冲区填充,您必须使用“忽略”执行选项,如下所示:

代码语言:javascript
运行
复制
child_process.execSync(`cd /tmp/myFolder ; tar -xjf myArchive.tar.bz2`, { stdio: 'ignore' });

阅读有关exec派生执行模式这里这里的更多信息

systematically P.S.还考虑到,当存档解压缩过程中磁盘空间耗尽时,此错误会产生

票数 26
EN

Stack Overflow用户

发布于 2021-08-27 19:20:54

如果输出对您很重要,请使用child_process.spawn。

即使您不需要它,执行输出在调试时也会很有帮助。您可以始终添加一个简单的开关,让您可以沉默输出,如果您选择。

我尽量不使用child_process.exec,因为child_process.spawn工作得很好,但不受exec的限制。当然,如果您的核心应用程序逻辑处理流数据,则使用YMMV。child_process.spawn在这里工作的原因是它流输出,而child_process.exec缓冲区输出,如果您填充了最大缓冲区,那么child_process.exec就会崩溃。您可以通过options参数来增加child_process.exec的缓冲区大小,但是请记住,缓冲区越大,您使用的内存就越多,而流通常将内存使用量保持在最低限度。

这里有一个参考实现。这段代码在Node v14上工作。

代码语言:javascript
运行
复制
const child_process = require("child_process");

function spawn(instruction, spawnOpts = {}, silenceOutput = false) {
    return new Promise((resolve, reject) => {
        let errorData = "";

        const [command, ...args] = instruction.split(/\s+/);

        if (process.env.DEBUG_COMMANDS === "true") {
            console.log(`Executing \`${instruction}\``);
            console.log("Command", command, "Args", args);
        }

        const spawnedProcess = child_process.spawn(command, args, spawnOpts);

        let data = "";

        spawnedProcess.on("message", console.log);

        spawnedProcess.stdout.on("data", chunk => {
            if (!silenceOutput) {
                console.log(chunk.toString());
            }

            data += chunk.toString();
        });

        spawnedProcess.stderr.on("data", chunk => {
            errorData += chunk.toString();
        });

        spawnedProcess.on("close", function(code) {
            if (code > 0) {
                return reject(new Error(`${errorData} (Failed Instruction: ${instruction})`));
            }

            resolve(data);
        });

        spawnedProcess.on("error", function(err) {
            reject(err);
        });
    });
}

// example usage
async function run() {
    await spawn("echo hello");
    await spawn("echo hello", {}, true);
    await spawn("echo hello", { cwd: "/" });
}

run();
票数 6
EN

Stack Overflow用户

发布于 2022-02-26 20:36:20

ENOBUFS意味着进程out的大小超过了,因此要修复此覆盖过程标准,这里是一个使用nodejs的示例:

代码语言:javascript
运行
复制
            let ops={}
            ops.args=['logcat','-t',"'m-d h:min:s.000'"]
            //set output file
            ops.log='tmp/logfile.txt'
            largeout=run('adb.exe',ops) 
             console.log(largeout)

             //+++++++++++++++utils+++++++++++++++++++
            function run(cmd,ops={args:'',log:''}) {
            const{readFileSync,openSync}=require('fs');
            cmd=ops.args?cmd+" "+ops.args:cmd;    
            try{
            //override stdio[stdin,stdout,stderr]
            if(ops.log) {let log=openSync(ops.log,'w');ops.stdio=[null,log,log]}
            let rs= require('child_process').execSync(cmd,ops);
            //nb:ops.log:path file used to fix pipe size max 200k ENOBUFS;
            if(ops.log) rs=readFileSync(ops.log,'utf8'); 
            return !rs?false:rs.toString();
            }catch(e){
            console.log('ags.run err:',e.message);
            return false;
            }
            }
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63796633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档