child_process
Node.js 中的 child_process
模块提供了一系列用于创建和管理子进程的API。这里列出一些常用的API及其使用示例:
1. child_process.exec()
异步执行命令并收集其输出,适合简单命令。
const { exec } = require('child_process');
exec('ls -l', (error, stdout, stderr) => {
if (error) {
console.error(`执行出错: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.error(`stderr: ${stderr}`);
});
2. child_process.execFile()
类似于 exec()
,但更安全且高效,因为它不会解析命令字符串,而是直接执行文件,并可传入参数数组。
const { execFile } = require('child_process');
execFile('ls', ['-l'], (error, stdout, stderr) => {
if (error) {
console.error(`错误: ${error}`);
return;
}
console.log(`标准输出: ${stdout}`);
console.error(`标准错误: ${stderr}`);
});
3. child_process.spawn()
用于创建一个新的子进程,返回一个ChildProcess实例,可用于复杂交互和流处理。
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`子进程退出码: ${code}`);
});
4. child_process.fork()
专门用于创建Node.js子进程,适用于父进程与子进程间通过IPC通信。
const { fork } = require('child_process');
const child = fork('./worker.js');
child.on('message', (message) => {
console.log('父进程收到消息:', message);
});
child.send({ hello: 'world' }); // 向子进程发送消息
5. child_process.execSync() 和 execFileSync()
同步版本的 exec()
和 execFile()
,会阻塞主线程直到命令完成。
const { execSync } = require('child_process');
try {
let output = execSync('ls -l', { encoding: 'utf8' });
console.log(output);
} catch (error) {
console.error(`执行出错: ${error}`);
}
请注意,在实际项目中,应谨慎使用同步API,因为它们会导致Node.js应用暂停响应,直到子进程结束。在可能的情况下,推荐使用异步版本以保持非阻塞特性。