Node.js子进程stdio参数使用场景解析

88 阅读2分钟

官方文档参考:nodejs.org/docs/v22.14…

1.  'pipe'

  • 作用:在父进程和子进程之间创建一个管道(pipe)。父进程可以通过 child_process.spawn() 返回的 ChildProcess 对象的 stdinstdout 和 stderr 流与子进程通信。

  • 示例

    javascript

    复制

    const { spawn } = require('child_process');
    const child = spawn('ls', ['-l'], { stdio: 'pipe' });
    
    child.stdout.on('data', (data) => {
      console.log(`输出:${data}`);
    });
    
  • 使用场景

    • 需要从子进程读取输出(如日志或命令结果)。
    • 需要向子进程发送输入(如交互式命令或数据传输)。
    • 默认值(如果不显式指定 stdio,则 stdio: 'pipe')。

2.  'overlapped' (仅 Windows)

  • 作用:类似于 'pipe',但在 Windows 上专门用于解决异步 I/O 问题(如避免阻塞)。仅对 stdout 和 stderr 有效。

  • 注意

    • 仅在 Windows 上有意义,其他平台会忽略。
    • Node.js 文档中较少提及,通常直接使用 'pipe' 即可。
  • 使用场景

    • 在 Windows 上需要异步处理子进程的输出时。

3.  'ignore'

  • 作用:完全忽略子进程的对应流。父进程无法通过管道通信,子进程的输入/输出会被丢弃。

  • 示例

    javascript

    复制

    const { spawn } = require('child_process');
    const child = spawn('ls', ['-l'], { stdio: ['ignore', 'ignore', process.stderr] });
    
  • 使用场景

    • 不需要子进程的输出(如后台任务)。
    • 不需要向子进程发送输入(如仅触发任务)。
    • 显式忽略错误流外的输出(如仅需记录错误)。

4.  'inherit'

  • 作用:子进程的输入/输出直接继承自父进程。子进程的 stdinstdoutstderr 会直接绑定到父进程的对应流。

  • 示例

    javascript

    复制

    const { spawn } = require('child_process');
    const child = spawn('ls', ['-l'], { stdio: 'inherit' });
    
  • 使用场景

    • 子进程需要直接与终端交互(如显示实时日志或接收用户输入)。
    • 希望子进程的输出直接打印到父进程的控制台(如命令行工具链)。

其他选项

  • 文件描述符(fd) :可以传递一个文件描述符(如 fs.open 返回的数值),将子进程的流绑定到指定文件。

    javascript

    复制

    const fs = require('fs');
    const { spawn } = require('child_process');
    const logFile = fs.openSync('output.log', 'w');
    const child = spawn('ls', ['-l'], { stdio: ['ignore', logFile, 'ignore'] });
    
  • 流对象:直接传递一个可读/可写流(如 process.stdout)。