# 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}`);
});