child_process
模块用于创建子进程。
js
const childProcess = require('node:child_process')
console.log(childProcess)
// process不包含fork方法
const process = require('node:process')
console.log(process.fork)
打印的 childProcess
大致如下:
js
{
_forkChild: [Function: _forkChild],
ChildProcess: [Function: ChildProcess],
exec: [Function: exec],
execFile: [Function: execFile],
execFileSync: [Function: execFileSync],
execSync: [Function: execSync],
fork: [Function: fork],
spawn: [Function: spawn],
spawnSync: [Function: spawnSync]
}
1.exec
exec
方法用于执行一个命令字符串,并返回一个 ChildProcess
对象。
js
/*
child_process.exec(command[, options][, callback])
*/
const childProcess = require('node:child_process')
childProcess.exec('ls -l', (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`)
return
}
console.log(`stdout: ${stdout}`)
console.error(`stderr: ${stderr}`)
})
2.execFile
execFile
方法用于执行一个可执行文件,并返回一个 ChildProcess
对象。
js
const { execFile } = require('child_process')
execFile('node', ['--version'], (error, stdout, stderr) => {
if (error) {
console.error(`execFile error: ${error}`)
return
}
console.log(`stdout: ${stdout}`)
if (stderr) {
console.error(`stderr: ${stderr}`)
}
})
3.fork
fork
是 Node.js
中用于创建子进程的一种特殊方法,它与 spawn
类似,但专门用于生成新的 Node.js
进程。
fork
创建的子进程会默认启用 IPC
(进程间通信)通道,便于父进程和子进程之间传递消息。
js
// parent.js
const { fork } = require('child_process')
const path = require('node:path')
// 创建子进程
const child = fork(path.resolve(__dirname, './3.fork_child.js'))
// 监听来自子进程的消息
child.on('message', (message) => {
console.log(`Received message from child: ${message}`)
})
// 向子进程发送消息
child.send('Hello from parent!')
child.on('exit', (code, signal) => {
console.log(`Child process exited with code ${code} and signal ${signal}`)
})
js
// child.js
// 监听来自父进程的消息
process.on('message', (message) => {
console.log(`Received message from parent: ${message}`)
// 向父进程发送消息
process.send('Hello from child!')
})
4.spawn
spawn
是一种用于在 Node.js
应用程序中创建新子进程的函数。
它提供了一种轻量级的方式来启动外部命令或程序,并且可以异步处理它们的输入和输出。
js
const { spawn } = require('child_process')
const ls = spawn('ls', ['-lh', '/users'])
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`)
})
ls.stderr.on('data', (data) => {
console.error(`stderr: ${data}`)
})
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`)
})