• 首页
  • nodejs
  • spawn exec方法 在 node.js child_process模块中的应用及区别 解决 Error: maxBuffer exceeded

spawn exec方法 在 node.js child_process模块中的应用及区别 解决 Error: maxBuffer exceeded

nodejs_black.png

node.js 的child_process模块中有两个方法spawn和exec,这两个方法都可以被用来开启一个子进程来执行其他的程序

既然两个方法的功能一样,那么究竟应该选择哪个方法。在本文中,我们将一起来探索spawn和我exec方法的不同之处,以便你在将来能够选择正确的方法

spawn


child_process.spaen会返回一个带有stdout和stderr流的对象。你可以通过stdout流来读取子进程返回给Node.js的数据。stdout拥有’data’,’end’以及一般流所具有的事件。当你想要子进程返回大量数据给Node时,比如说图像处理,读取二进制数据等等,你最好使用spawn方法



child_process.spawn方法是“异步中的异步”,意思是在子进程开始执行时,它就开始从一个流总将数据从子进程返回给Node


下面我们用 spawn 来执行一段 shell

var cp = require('child_process');
  //spawn
  var ls = cp.spawn('ls'/*command*/, ['-lh', '/usr']/*args*/, {}/*options, [optional]*/);
  ls.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
  });

  ls.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
  });

  ls.on('exit', function (code) {
    console.log('child process exited with code ' + code);
  });

exec


child_process.exec方法是“同步中的异步”,意思是尽管exec是异步的,它一定要等到子进程运行结束以后然后一次性返回所有的buffer数据。如果exec的buffer体积设置的不够大,它将会以一个“maxBuffer exceeded”错误失败告终

child_process.exec方法会从子进程中返回一个完整的buffer。默认情况下,这个buffer的大小应该是200k。如果子进程返回的数据大小超过了200k,程序将会崩溃,同时显示错误信息“Error:maxBuffer exceeded”。你可以通过在exec的可选项中设置一个更大的buffer体积来解决这个问题,但是你不应该这样做,因为exec本来就不是用来返回很多数据的方法。对于有很多数据返回的情况,你应该使用上面的spawn方法。那么exec究竟是用来做什么的呢?我们可以使用它来运行程序然后返回结果的状态,而不是结果的数据


我们再使用 exec 来执行一次


var cp = require('child_process');

  var ls = cp.exec('ls -lh /usr', {}/*options, [optional]*/);

  ls.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
  });

  ls.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
  });

  ls.on('exit', function (code) {
    console.log('child process exited with code ' + code);
  });

二者对比

不论是 spawn 还是 exec ,这2个方法在调用的时候都有第二个参数 option ,这里我们往往忽略掉此参数

他的作用是什么?

他可以帮我们设定子进程的运行环境和执行条件

那对于我们没有指定 option 参数时,上面2个函数的调用都使用了什么样的默认参数

spawn

{ 
   cwd: undefined,
   env: process.env,
   setsid: false
 }

exec

{ 
   encoding: 'utf8',
   timeout: 0, /*子进程最长执行时间 */
   maxBuffer: 200*1024,  /*stdout和stderr的最大长度*/
   killSignal: 'SIGTERM',
   cwd: null,
   env: null
 }

在exec的options中有一个选项maxBuffer,maxBuffer 默认接收 stdout 输出值为 200k,如果超出,就出现这个错误了 Error: maxBuffer exceede


你可以通过在exec的可选项中设置一个更大的buffer体积来解决这个问题,但是你不应该这样做,因为exec本来就不是用来返回很多数据的方法

对于有很多数据返回的情况,你应该使用上面的spawn方法。那么exec究竟是用来做什么的呢?我们可以使用它来运行程序然后返回结果的状态,而不是结果的数据

出自:spawn exec方法 在 node.js child_process模块中的应用及区别 解决 Error: maxBuffer exceeded



回到顶部