child_process
使用目的
- 子进程的运行结果储存在系统缓存之中(最大200Kb)
- 等到子进程运行结束以后,主进程再用回调函数读取子进程的运行结果
API
exec(cmd,options,fn)
- execute的缩写,用于执行bash命令
- 同步版本:execSync
const { exec } = require('child_process');
exec('ls ../', (error, stdout, stderr)=> {
console.log(error);
console.log(stdout);
console.log(stderr);
})
image.png
流
const { exec } = require('child_process');
const stream = exec('ls ../')
stream.stdout.on('data', (chunk)=> {
console.log('stdout' + chunk)
})
stream.stderr.on('data', (chunk)=> {
console.log('stderr' + chunk)
})
stream.on('close', (code)=> {
console.log('closing code:' + code)
})
Promise
- 可以使其Promise化(用
util.promisify)有漏洞
const { exec } = require('child_process');
const util = require("util");
const exec2 = util.promisify(exec)
exec2('ls ../').then(data=> {
console.log(data.stdout)
})
- 如果cmd被注入了,可能执行意外的代码推荐使用 execFile
options
几个常用的选项
cwd - Current working directory-
env-环境变量 -
shell-用什么shell -
maxBuffer-最大缓存,默认1024*1024字节
const { execFile } = require('child_process');
const userInput = ".";
execFile('ls', ['-la', userInput], {
cwd: 'c:\\', // 改变命令的目录,默认是当前目录
env: {NODE_ENV: 'development'}, // 环境变量
maxBuffer: 1024 * 1024,
shell: '路径'
}, (error, stdout)=> {
console.log(error)
console.log(stdout)
})
API
execFile
执行特定的程序
命令行的参数要用数组形式传入,无法注入同步版本:execFileSync
const { execFile } = require('child_process');
const userInput = ".";
execFile('ls', ['-la', userInput], (error, stdout)=> {
console.log(error)
console.log(stdout)
})
支持流吗?
const { execFile } = require('child_process');
const userInput = ".";
const stream = execFile('ls', ['-la', userInput])
stream.stdout.on('data', (chunk)=> {
console.log(chunk)
})
API
spawn
- 用法与execFile方法类似
- 没有回调函数,只能通过流事件获取结果
- 没有最大200Kb的限制(因为是流)
经验
能用 spawn的时候就不要用execFile
const { spawn } = require('child_process');
const userInput = ".";
const stream = spawn('ls', ['-la', userInput], {
cwd: 'c:\\', // 改变命令的目录,默认是当前目录
env: {NODE_ENV: 'development'}, // 环境变量
})
stream.stdout.on('data', (chunk) => {
console.log(chunk.toString())
})
API
fork
- 创建一个子进程,执行Node脚本
- fork('./child.js')相当于 spawn('node', ['./child.js'])
特点
- 会多出一个message事件,用于父子通信
- 会多出一个send方法
n.js
const {fork} = require('child_process')
const n = fork('./child.js');
n.on('message', (msg)=> {
console.log('父进程得到子进程传的值', msg)
})
n.send({
hello: 'world'
})
child.js
setTimeout(()=> {
process.send({foo: 'bar'})
}, 2000)
process.on('message', (msg)=> {
console.log('子进程得到父进程的值');
console.log(msg);
})
image.png








网友评论