美文网首页
child_process

child_process

作者: kzc爱吃梨 | 来源:发表于2022-02-17 01:18 被阅读0次

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

相关文章

网友评论

      本文标题:child_process

      本文链接:https://www.haomeiwen.com/subject/rtsjlrtx.html