• command {string} 要运行的命令。
    • args {string[]} 字符串参数的列表。
    • options {Object}
      • cwd {string} 子进程的当前工作目录。
      • env {Object} 环境变量的键值对。 默认值: process.env
      • argv0 {string} 显式地设置发送给子进程的 argv[0] 的值。 如果没有指定,则会被设置为 command 的值。
      • stdio {Array|string} 子进程的 stdio 配置,参见 [options.stdio][stdio]。
      • detached {boolean} 使子进程独立于其父进程运行。 具体行为取决于平台,参见 [options.detached]。
      • uid {number} 设置进程的用户标识,参见 setuid(2)。
      • gid {number} 设置进程的群组标识,参见 setgid(2)。
      • serialization {string} 指定用于在进程之间发送消息的序列化类型。 可能的值为 'json''advanced'。 详见[高级序列化][Advanced serialization]。 默认值: 'json'
      • shell {boolean|string} 如果为 true,则在 shell 中运行 command。 在 Unix 上使用 '/bin/sh',在 Windows 上使用 process.env.ComSpec。 可以将不同的 shell 指定为字符串。 参见 [shell 的要求][Shell requirements]和[默认的 Windows shell][Default Windows shell]。 默认值: false(没有 shell)。
      • windowsVerbatimArguments {boolean} 在 Windows 上不为参数加上引号或转义。 在 Unix 上会被忽略。 如果指定了 shell 并且是 CMD,则自动设为 true默认值: false
      • windowsHide {boolean} 隐藏子进程的控制台窗口(在 Windows 系统上通常会创建)。 默认值: false
    • 返回: {ChildProcess}

    child_process.spawn() 方法使用给定的 command 衍生新的进程,并传入 args 中的命令行参数。 如果省略 args,则其默认为空数组。

    如果启用了 shell 选项,则不要将未经过处理的用户输入传给此函数。 包含 shell 元字符的任何输入都可用于触发任意命令的执行。

    第三个参数可用于指定额外的选项,具有以下默认值:

    1. const defaults = {
    2. cwd: undefined,
    3. env: process.env
    4. };

    使用 cwd 指定衍生进程的工作目录。 如果没有给定,则默认为继承当前工作目录。 如果给定,但路径不存在,则子进程会触发 ENOENT 错误并立即退出。 当命令不存在时,也会触发 ENOENT

    使用 env 指定新进程可见的环境变量,默认为 [process.env]。

    env 中的 undefined 值会被忽略。

    示例,运行 ls -lh /usr,并捕获 stdoutstderr、以及退出码:

    1. const { spawn } = require('child_process');
    2. const ls = spawn('ls', ['-lh', '/usr']);
    3. ls.stdout.on('data', (data) => {
    4. console.log(`stdout: ${data}`);
    5. });
    6. ls.stderr.on('data', (data) => {
    7. console.error(`stderr: ${data}`);
    8. });
    9. ls.on('close', (code) => {
    10. console.log(`子进程退出,退出码 ${code}`);
    11. });

    示例,以非常精细的方式运行 ps ax | grep ssh

    1. const { spawn } = require('child_process');
    2. const ps = spawn('ps', ['ax']);
    3. const grep = spawn('grep', ['ssh']);
    4. ps.stdout.on('data', (data) => {
    5. grep.stdin.write(data);
    6. });
    7. ps.stderr.on('data', (data) => {
    8. console.error(`ps stderr: ${data}`);
    9. });
    10. ps.on('close', (code) => {
    11. if (code !== 0) {
    12. console.log(`ps 进程退出,退出码 ${code}`);
    13. }
    14. grep.stdin.end();
    15. });
    16. grep.stdout.on('data', (data) => {
    17. console.log(data.toString());
    18. });
    19. grep.stderr.on('data', (data) => {
    20. console.error(`grep stderr: ${data}`);
    21. });
    22. grep.on('close', (code) => {
    23. if (code !== 0) {
    24. console.log(`grep 进程退出,退出码 ${code}`);
    25. }
    26. });

    示例,检查失败的 spawn

    1. const { spawn } = require('child_process');
    2. const subprocess = spawn('错误的命令');
    3. subprocess.on('error', (err) => {
    4. console.error('启动子进程失败');
    5. });

    一些平台(macOS、Linux)会使用 argv[0] 的值作为进程的标题,而其他平台(Windows、SunOS)则使用 command

    Node.js 在启动时会使用 process.execPath 重写 argv[0],因此 Node.js 子进程的 process.argv[0] 不会匹配从父进程传给 spawnargv0 参数,可以使用 process.argv0 属性获取。