1. 利用子进程spawn调用系统命令
const child_process = require('child_process');
let cmd = 'rm';
let args = ('-rf ./demo').split(' ');
let task = child_process.spawn(cmd, args, {
cwd: cwd
});
task.stdout.on('data', (data) => {
console.log(`${data}`);
})
task.stderr.on('data', (data) => {
console.log(`${data}`);
})
child_process.spawn
返回stdout
和stderr
流对象。 程序可以通过stdout
的data
、end
或者其他事件来获取子进程返回的数据。 使用spawn方法时,子进程一开始执行就会通过流返回数据,因此spawn适合子进程返回大量数据的情形。
与exec相比,spawn还可以对子进程进行更详细的设置。 例如使子进程在后台运行,成为一个daemon程序,不随着父进程的退出而退出。
2.利用子进程exec调用系统命令
var exec = require('child_process').exec;
exec('ls -al', function(error, stdout, stderr){
if(error) {
console.error('error: ' + error);
return;
}
console.log('stdout: ' + stdout);
console.log('stderr: ' + typeof stderr);
child_process.exec返回整个子进程处理时产生的buffer,这个buffer默认大小是200K。 当子进程返回的数据超过默认大小时,程序就会产生”Error: maxBuffer exceeded”异常。 调大exec的maxBuffer选项可以解决这个问题,不过当子进程返回的数据太过巨大的时候,这个问题还会出现。 因此当子进程返回的数据超过默认大小时,最好的解决方法是使用spawn方法。
总结
从实现原理来说,spawn是更底层的接口,exec对spawn进行了再次封装,提供了更简单的API接口。
- exec比spawn易于使用,当子进程返回的数据不超过200K时,exec比spawn更适合。
- 当子进程需要返回大量数据时,spawn更安全。
- spawn提供了更多的选项,可以对子进程进行更详细的设置。