Child processes 子进程
创建子进程
spawn
执行命令exec
执行命令execFile
执行可执行文件fork
创建node子进程execSync
执行命令 同步执行execFileSync
执行可执行文件 同步执行spawnSync
执行命令 同步执行
exec
js
child_process.exec(command[, options][, callback])
示例:获取 nodejs 版本号
js
const { exec } = require('node:child_process')
exec('node -v', (err, stdout, stderr) => {
if(err) return err
console.log(stdout.toString())
})
command
command 要运行的命令,带有以空格分隔的参数。
options
配置项 | 描述 |
---|---|
cwd | 子进程的当前工作目录。默认值: process.cwd() |
env | 环境键值对。默认值: process.env |
encoding | 默认: 'utf8' |
signal | 允许使用 AbortSignal 中止子进程 |
shell | 用于执行命令的 Shell, 默认值: '/bin/sh' 在 Unix 上, process.env.ComSpec 在 Windows 上 |
timeout | 默认: 0 |
maxBuffer | stdout 或 stderr 上允许的最大数据量(以字节为单位)。如果超过此值,则子进程将终止,并且任何输出都将被截断。 默认值: 1024 * 1024 |
killSignal | 默认: 'SIGTERM' |
uid | 设置进程的用户标识 |
gid | 设置进程的组标识 |
windowsHide | 隐藏通常在 Windows 系统上创建的子进程控制台窗口。默认值: false |
callback
callback 在进程终止时使用输出调用。
- 参数一:
error
- error 将是 null .出错时, error 将是 Error 的实例, 该 error.code 属性将是进程的退出代码。按照惯例,除0以外的 任何退出代码都表示错误。 error.signal 将是终止进程的信号。 - 参数二:
stdout
- 参数三:
stderr
execSync
打开谷歌浏览器, 如果要执行单次shell命令execSync方便一些 options同上, 以下会打开百度并且进入无痕模式
js
execSync("start chrome http://www.baidu.com --incognito")
execFileSync
适合执行可执行文件,例如执行一个node脚本,或者shell文件,windows可以编写cmd脚本,posix,可以编写sh脚本
简单示例:bat.cmd中
创建一个文件夹mkdir 进入目录 写入一个文件test.js 最后执行
sh
echo '开始'
mkdir test
cd ./test
echo console.log("test1232131") >test.js
echo '结束'
node test.js
js文件内
注意:可能会存在执行sh文件权限不足的情况,则执行
chmod 777 ./*.sh
命令即可
js
const { execFile } = require('node:child_process')
const path = require('node:path')
execFile(path.join(__dirname, './mingling.sh'), null,(error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
})
spawn
spawn
用于执行一些实时获取的信息因为spawn返回的是流,边执行边返回,
exec
是返回一个完整的buffer,buffer的大小是200k,超出则会报错,而spawn是无上限的
TIP
spawn
在执行完成后会抛出close事件监听,并返回状态码,通过状态码可以知道子进程是否顺利执行。 exec
只能通过返回的buffer去识别完成状态,识别起来较为麻烦
js
const { spawn } = require('node:child_process')
// 命令 参数 配置
const { stdout } = spawn('netstat', ['-an'], {})
// 返回的数据用data事件接受
stdout.on('data', (steram) => {
console.log(steram.toString())
})
exec -> execFile -> spawn
exec是底层通过execFile实现 execFile底层通过spawn实现
fork
场景适合大量的计算,或者容易阻塞主进程操作的一些代码,就适合开发fork
它相当于给当前程序再开了一个进程,来执行其他js文件
index.js
js
const { fork } = require('node:child_process')
const testProcess = fork('./test.js')
testProcess.send('我是主进程')
testProcess.on("message",(data)=>{
console.log('我是主进程接受消息111:',data)
})
// 控制台输出:
// 测试 打印测试
// 子进程接收消息 我是主进程
// 我是主进程接受消息111: 我是子进程
test.js
js
console.log('测试', '打印测试');
process.on('message', (data) => {
console.log('子进程接收消息', data)
})
process.send('我是子进程')
send
发送信息 ,message
接收消息,可以相互发送接收。
fork底层使用的是IPC通道进行通讯的