spawn exec方法 在 node.js child_process模块中的应用及区别 解决 Error: maxBuffer exceeded
文章目录
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