收录了这篇文章
在 Node.js 中,child_process 模块允许您生成并控制子进程。这对于执行外部命令(例如 shell 命令)非常有用,可以用来与文件系统进行交互、运行脚本等。child_process 提供了几种方法来创建子进程,包括 spawn, exec, execFile, 和 fork。
1. 使用 spawn
spawn 是用于生成子进程的最通用的方法。它会立即启动一个新进程,并且可以处理大量的数据流。
示例代码:
const { spawn } = require('node: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}`);
});
2. 使用 exec
exec 方法用于执行一个命令并缓冲输出结果。它非常适合于执行简单的命令行操作,但它将整个输出缓存到内存中,因此不适合处理大量数据。
示例代码:
const { exec } = require('node:child_process');
exec('cat *.js badfile | wc -l', (error, stdout, stderr) => {
if (error) {
console.error(`执行出错: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.error(`stderr: ${stderr}`);
});
3. 使用 execFile
execFile 直接运行一个可执行文件,而不通过 shell。这比 exec 更有效率,因为它省去了启动 shell 的步骤。
示例代码:
const { execFile } = require('node:child_process');
execFile('node', ['--version'], (error, stdout, stderr) => {
if (error) {
console.error(`执行出错: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.error(`stderr: ${stderr}`);
});
4. 使用 fork
fork 方法是 spawn 的一个特例,专门用于创建新的 Node.js 进程。这使得父进程和子进程之间可以直接通过 IPC(进程间通信)通道交换消息。
示例代码:
const { fork } = require('node:child_process');
const child = fork('./child.js');
child.send({ hello: 'world' });
child.on('message', (msg) => {
console.log('从子进程接收消息:', msg);
});
child.on('exit', (code) => {
console.log(`子进程已退出,退出码为 ${code}`);
});
注意事项
- 在使用这些方法时,需要注意安全性和资源管理。确保正确处理错误,并避免泄露敏感信息。
- 对于长时间运行的任务或处理大量数据的情况,考虑使用 spawn 或 fork 而不是 exec,以避免内存溢出。
- 当使用 exec 或 execFile 时,应当对传递给命令的参数进行适当的转义或验证,以防止注入攻击。
声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。