来自:https://juejin.cn/post/7277045020422930488
child_process用于处理CPU密集型应用,Nodejs创建子进程有7个API,其中带Async的是同步API,不带的是异步API
child_process.exec(command[, options][, callback])
command:要运行的命令,参数以空格分隔
options: 配置项
cwd: 子进程的当前工作目录
env: 环境变量键值对
encoding:默认值: ‘utf8’
shell:用于执行命令的shell,在UNIX上默认为’/bin/sh’,在Windows上默认为process.env.ComSpec
timeout:默认是0
maxBuffer:标准输出或者标准错误上允许的最大数据量(单位: 字节),如果超过子进程将终止并截断任何输出,默认值:1024 * 1024
killSignal: 默认为’SIGIERM’
uid: 设置进程的用户身份
gid:设置进程的组标识
windowsHide:隐藏通常在Windows系统上创建的子进程控制台窗口
callback:当进程终止时调用输出
const { exec, } = require('child_process')
exec('node -v',(err,stdout,stderr)=>{
if(err){
return err
}
console.log(stdout.toString())//打印出node版本号
})
child_process.execSync(command[, options])
command:要运行的命令。
options: 配置项,比上面多了stdio,input
stdio:子进程的标准输入输出配置,除非指定stdio,默认情况下stderr将输出的父进程的标准错误,默认值pipe
获取node版本号,如果要执行单次shell命令execSync方便一些
const { exec, spawn, execSync } = require('child_process')
const nodeVersion = execSync('node -v')
console.log(nodeVersion.toString("utf-8"))
打开谷歌浏览器,并打开百度无痕浏览模式
execSync("start chrome http://www.baidu.com --incognito")
child_process.execFile(file[, args][, options][, callback])
适合执行可执行文件,如一个node脚本或者shell文件
file:要允许可执行文件的路径或文件名
args: 字符串参数列表
options:配置项,比上面多了windowsVerbatimArguments
windowsVerbatimArguments: 在Windows上不为参数加引号或转义,在Unix上被忽略,默认是false
新建bat.cmd脚本
echo '开始'
mkdir test
cd ./test
echo console.log('testdddd') >test.js
echo '结束'
node test.js
execFile执行这个脚本
const { execFile } = require('child_process')
const path = require('path')
execFile(path.resolve(process.cwd(), './bat.cmd'), null, (err,stdout) =>{
console.log(stdout.toString())
})
生成文件
child_process.spawn()
用于创建一个子进程,并执行指定的程序
spawn用于执行一些实时获取的信息,因为spawn返回的是流,边执行边返回,exec是返回一个完整的buffer,buffer的大小是200K,如果超出会报错,而spawn是无上限的
spawn在执行完成后会抛出close事件监听,并返回状态码,通过状态码可以知道子进程是否顺利执行,exec只能通过返回buffer去识别完成状态,识别起来较为麻烦
启动一个 ls -lh /usr 的子进程,并监听其 stdout, stderr 和 close 事件,然后分别打印这些事件的数据或状态。
const { spawn } = require('child_process')
// 创建一个子进程 ls 并执行了 ls 命令,同时传入了 -lh 和 /usr 这两个参数。-lh 参数让 ls 命令以人类可读的格式列出文件大小,并且以长格式显示文件信息。/usr 是要列出目录的内容。
const ls = spawn('ls',['-lh', '/usr'])
// 当子进程有输出数据到标准输出流 (stdout) 时的处理函数。每当有数据从 ls 命令的标准输出流中流出,就会触发这个事件处理器,并打印出相应的数据
ls.stdout.on('data', (data) =>{
console.log(`stdout: ${data}`)
})
// 当子进程有输出数据到标准错误流 (stderr) 时的处理函数。每当有数据从 ls 命令的标准错误流中流出,就会触发这个事件处理器,并打印出相应的数据。
ls.stderr.on('data', (data) =>{
console.log(`stderr: ${data}`)
})
// 当子进程结束时的处理函数。close 事件在子进程完全关闭后被触发,并提供退出码作为参数
ls.on('close', (code) =>{
console.log(`child process exited with code ${code}`)
})
child_process.fork(modulePath[, args][, options])
还是看文档吧(https://nodejs.cn/api/child_process.html#child_processforkmodulepath-args-options)
fork 函数允许你在当前 Node.js 进程中创建一个新的子进程,并且这个子进程运行的是 Node.js 脚本
modulePath:要在子进程中运行的模块
args:字符串参数列表
options:配置项
options
cwd | 子进程的当前工作目录。
detached 准备子进程独立于其父进程运行。具体行为取决于平台,参见 options.detached。
env 环境变量键值对。默认值:process.env。
execPath 用于创建子进程的可执行文件。
execArgv <string[]> 传给可执行文件的字符串参数列表。默认值:process.execArgv。
gid 设置进程的组标识(请参阅 setgid(2))。
serialization 指定用于在进程之间发送消息的序列化类型。可能的值为 ‘json’ 和 ‘advanced’。有关详细信息,请参阅 高级序列化。默认值:‘json’。
signal 允许使用中止信号关闭子进程。
killSignal | 当衍生的进程将被超时或中止信号杀死时要使用的信号值。默认值:‘SIGTERM’。
silent 如果为 true,则子进程的标准输入、标准输出和标准错误将通过管道传输到父进程,否则它们将从父进程继承,有关详细信息,请参阅 child_process.spawn() 的 stdio 的 ‘pipe’ 和 ‘inherit’ 选项。默认值:false。
stdio | 参见 child_process.spawn() 的 stdio。提供此选项时,它会覆盖 silent。如果使用数组变体,则它必须恰好包含一个值为 ‘ipc’ 的条目,否则将抛出错误。例如 [0, 1, 2, ‘ipc’]。
uid 设置进程的用户身份(请参阅 setuid(2))。
windowsVerbatimArguments 在 Windows 上不为参数加上引号或转义。在 Unix 上被忽略。默认值:false。
timeout 允许进程运行的最长时间(以毫秒为单位)。默认值:undefined。
const { fork } = require('child_process')
// 创建一个新的子进程,这个子进程会执行名为 child.js 的脚本文件。child.js 应该位于当前工作目录下或路径明确指向的位置
const childProcess = fork('child.js')
// 向子进程发送了一条消息。send 方法允许主进程向子进程发送任意的消息数据。这里发送的消息内容是 'hi 我是主进程'
childProcess.send('hi 我是主进程')
// 设置了一个事件监听器,监听来自子进程的消息。当子进程通过 process.send() 方法发送消息给主进程时,会触发这个监听器,并执行回调函数
childProcess.on("message", (data) =>{
// 当子进程发送消息给主进程时,这个回调函数会被调用,并打印接收到的消息内容
console.log('我是主进程接收消息:', data)
})
被子进程执行的脚本, 该子进程独立于父进程,除了两者之间建立的 IPC 通信通道。每个进程都有自己的内存,具有自己的 V8 实例。由于需要额外的资源分配,关于IPC通信可以看这个: https://zhuanlan.zhihu.com/p/465574868
// 注册了一个事件监听器,用于监听 message 事件。每当子进程从父进程那里接收到消息时,这个监听器就会被触发,并执行提供的回调函数。
process.on('message', data =>{
console.log('子进程接收消息:',data)
})
// 向父进程发送一条消息。消息内容是 '我是子进程'process.send() 方法允许子进程向父进程发送数据
process.send('我是子进程')