在 nodejs 执行 shell 指令
# 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}`);
})
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
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);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
child_process.exec
返回整个子进程处理时产生的buffer
,这个buffer
默认大小是200K
。 当子进程返回的数据超过默认大小时,程序就会产生”Error: maxBuffer exceeded”
异常。 调大exec
的maxBuffer
选项可以解决这个问题,不过当子进程返回的数据太过巨大的时候,这个问题还会出现。 因此当子进程返回的数据超过默认大小时,最好的解决方法是使用spawn
方法。
# 总结
从实现原理来说,spawn
是更底层的接口,exec
对spawn
进行了再次封装,提供了更简单的API
接口。
exec
比spawn
易于使用,当子进程返回的数据不超过200K
时,exec
比spawn
更适合。当子进程需要返回大量数据时,
spawn
更安全。spawn
提供了更多的选项,可以对子进程进行更详细的设置。
上次更新: 2024/01/30, 00:35:17
- 01
- Node与GLIBC_2.27不兼容解决方案08-19
- 02
- Git清空本地文件跟踪缓存08-13