Node.js child_process 模块
Node.js 教程
收录了这篇文章

在 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 时,应当对传递给命令的参数进行适当的转义或验证,以防止注入攻击。

修改时间 2024-11-13

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
WordPress用户的user_login, user_nicename, display_name 和 nickname有什么区别
WordPress 添加文章自定义字段
JavaScript 表单事件
CRSF 跨站脚本攻击已死,使用 Same-Site Cookies 来防范 CSRF
HTML input 元素
JavaScript screen对象
Nginx 通过日志统计访问数据
WordPress WP_Query() 文章置顶的方法