阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      Node.js child_process 子进程

      Node.js child_process 子进程

      child_process 模块提供了以与 popen(3) 类似但不相同的方式衍生子进程的功能。 此功能主要由 child_process.spawn() 函数提供:

      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.log(`stderr: ${data}`);
      });
      
      ls.on('close', (code) => {
        console.log(`子进程退出码:${code}`);
      });
      

      默认情况下, stdin、 stdout 和 stderr 的管道在父 Node.js 进程和衍生的子进程之间建立。 这些管道具有有限的(和平台特定的)容量。 如果子进程在没有捕获输出的情况下写入超出该限制的 stdout,则子进程将阻塞等待管道缓冲区接受更多的数据。 这与 shell 中的管道的行为相同。 如果不消费输出,则使用 { stdio: ‘ignore’ } 选项。

      child_process.spawn() 方法异步地衍生子进程,且不阻塞 Node.js 事件循环。 child_process.spawnSync() 方法则以同步的方式提供等效功能,但会阻止事件循环直到衍生的进程退出或终止。

      为方便起见, child_process 模块提供了 child_process.spawn() 和 child_process.spawnSync() 的一些同步和异步的替代方法。 注意,这些替代方法中的每一个都是基于 child_process.spawn() 或 child_process.spawnSync() 实现的。

      • child_process.exec(): 衍生一个 shell 并在该 shell 中运行命令,当完成时则将 stdout 和 stderr 传给回调函数。
      • child_process.execFile(): 类似于 child_process.exec(),除了它默认会直接衍生命令且不首先衍生 shell。
      • child_process.fork(): 衍生一个新的 Node.js 进程,并通过建立 IPC 通信通道来调用指定的模块,该通道允许在父进程与子进程之间发送消息。
      • child_process.execSync(): child_process.exec() 的同步版本,会阻塞 Node.js 事件循环。
      • child_process.execFileSync(): child_process.execFile() 的同步版本,会阻塞 Node.js 事件循环。

      对于某些用例,例如自动化的 shell 脚本,同步的方法可能更方便。 但是在大多数情况下,同步的方法会对性能产生重大影响,因为它会停止事件循环直到衍生的进程完成。

      目录
      本文目录
      目录