# NodeJS中的child_process模块
# spawn 和 exec 的区别
总体来说
spawn返回一个stream,exec返回一个buffer接受参数的方式:
spawn使用了参数数组,而exec则直接接在命令后。- 比如要运行
du -sh /disk1命令, 使用spawn函数需要写成spawn('du', ['-sh ', '/disk1']); - 而使用
exec函数时,可以直接写成exec('du -sh /disk1')。exec是会先进行Shell语法解析,因此用exec函数可以更方便的使用复杂的Shell命令,包括管道、重定向等。
- 比如要运行
child_process.spawn
child_process.spawn返回一个有输出流和错误的流的对象,你可以监听它们从而获取数据,输出流有数据和结束事件,child_process.spawn适合用在处理大量数据返回的场景中,图片处理,读二进制数据等等。child_process.spawn是一个异步的异步函数,怎么解释呢?child_process.spawn在执行时就会返回数据,而不是等到数据都处理好了再一次返回。
child_process.exec
child_process.exec一次性返回输出执行结果内容,默认的buffer大小为200kb,如果exec返回的内容超过200kb则会返回一个错误:Error maxBuffer execeded,你可以通过设置options buffer的size来扩大buffer的大小。child_process.exec是一个同步的异步方法,这个意思是,虽然方法体本身是异步的,但是它要等child process执行完成后,再把返回数据一口气返回给回调方法。如果返回内容超过了设置的buffer size,则会返回一个maxBuffer exceeded错误。
spawn例子:
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`子进程退出码:${code}`);
});
exec例子:
const { exec } = require('child_process');
exec('cat *.js missing_file | wc -l', (error, stdout, stderr) => {
if (error) {
console.error(`执行出错: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});