Skip to content

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
maxBufferstdout 或 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通道进行通讯的

Released under the MIT License.