Spec-Zone.ru › Node.js 24 LTS

Дочерний процесс

Стабильность: 2 — Стабильный

Исходный код: lib/child_process.js

Модуль node:child_process позволяет создавать дочерние процессы способом, похожим, но не идентичным popen(3). Эта возможность в основном обеспечивается функцией child_process.spawn():

CommonJS
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(`child process exited with code ${code}`);
});
Модули JavaScript
import { spawn } from 'node:child_process';
import { once } from 'node:events';
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

const [code] = await once(ls, 'close');
console.log(`child process exited with code ${code}`);

По умолчанию между родительским процессом Node.js и созданным дочерним процессом устанавливаются каналы для stdin, stdout и stderr. Пропускная способность этих каналов ограничена и зависит от платформы. Если дочерний процесс записывает в stdout объём данных, превышающий этот предел, а вывод при этом не считывается, дочерний процесс блокируется в ожидании, пока буфер канала не освободит место для новых данных. Это соответствует поведению каналов в оболочке. Используйте параметр { stdio: 'ignore' }, если вывод не будет считываться.

Поиск команды выполняется с использованием переменной окружения options.env.PATH, если в объекте options задано значение env. В противном случае используется process.env.PATH. Если задано options.env, но не задано PATH, в Unix поиск выполняется по стандартному списку каталогов /usr/bin:/bin (см. руководство операционной системы по execvpe/execvp), а в Windows используется переменная окружения PATH текущего процесса.

В Windows имена переменных окружения не учитывают регистр. Node.js сортирует ключи env в лексикографическом порядке и использует первый ключ, совпадающий без учёта регистра. Дочернему процессу передаётся только первая запись в лексикографическом порядке. Это может привести к проблемам в Windows при передаче объекту параметра env нескольких вариантов одного и того же ключа, например PATH и Path.

Метод child_process.spawn() запускает дочерний процесс асинхронно, не блокируя цикл событий Node.js. Функция child_process.spawnSync() обеспечивает аналогичную функциональность синхронно и блокирует цикл событий до завершения или остановки запущенного процесса.

Для удобства модуль node:child_process предоставляет несколько синхронных и асинхронных альтернатив функциям child_process.spawn() и child_process.spawnSync(). Каждая из этих альтернатив реализована на основе child_process.spawn() или child_process.spawnSync().

  • child_process.exec(): запускает оболочку и выполняет в ней команду, передавая stdout и stderr функции обратного вызова после завершения.
  • child_process.execFile(): похожа на child_process.exec(), но по умолчанию запускает команду напрямую, не создавая предварительно оболочку.
  • child_process.fork(): запускает новый процесс Node.js и вызывает указанный модуль, устанавливая канал связи IPC, который позволяет отправлять сообщения между родительским и дочерним процессами.
  • child_process.execSync(): синхронная версия child_process.exec(), которая блокирует цикл событий Node.js.
  • child_process.execFileSync(): синхронная версия child_process.execFile(), которая блокирует цикл событий Node.js.

В некоторых случаях, например при автоматизации сценариев оболочки, синхронные аналоги могут быть удобнее. Однако во многих случаях синхронные методы могут значительно снизить производительность, поскольку цикл событий блокируется до завершения запущенных процессов.

Асинхронное создание процессов

Методы child_process.spawn(), child_process.fork(), child_process.exec() и child_process.execFile() следуют идиоматичному шаблону асинхронного программирования, характерному для других API Node.js.

Каждый из этих методов возвращает экземпляр ChildProcess. Эти объекты реализуют API EventEmitter Node.js, позволяя родительскому процессу регистрировать функции-обработчики, которые вызываются при возникновении определённых событий в течение жизненного цикла дочернего процесса.

Методы child_process.exec() и child_process.execFile() также позволяют указать необязательную функцию callback, которая вызывается при завершении дочернего процесса.

Запуск файлов .bat и .cmd в Windows

Важность различия между child_process.exec() и child_process.execFile() может зависеть от платформы. В операционных системах семейства Unix (Unix, Linux, macOS) метод child_process.execFile() может быть эффективнее, поскольку по умолчанию он не запускает оболочку. Однако в Windows файлы .bat и .cmd не могут выполняться самостоятельно без терминала, поэтому их нельзя запустить с помощью child_process.execFile(). В Windows файлы .bat и .cmd можно запускать с помощью child_process.spawn(), установив параметр shell, с помощью child_process.exec() или запустив cmd.exe и передав файл .bat или .cmd в качестве аргумента (именно это делают параметр shell и метод child_process.exec()). В любом случае, если имя файла сценария содержит пробелы, его необходимо заключить в кавычки.

CommonJS
// OR...
const { exec, spawn } = require('node:child_process');

exec('my.bat', (err, stdout, stderr) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(stdout);
});

// Script with spaces in the filename:
const bat = spawn('"my script.cmd" a b', { shell: true });
// or:
exec('"my script.cmd" a b', (err, stdout, stderr) => {
  // ...
});
Модули JavaScript
// OR...
import { exec, spawn } from 'node:child_process';

exec('my.bat', (err, stdout, stderr) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(stdout);
});

// Script with spaces in the filename:
const bat = spawn('"my script.cmd" a b', { shell: true });
// or:
exec('"my script.cmd" a b', (err, stdout, stderr) => {
  // ...
});

child_process.exec(command[, options][, callback])

История
Версия Изменения
v15.4.0

Добавлена поддержка AbortSignal.

v16.4.0, v14.18.0

Параметр cwd может иметь тип WHATWG URL с использованием протокола file:.

v8.8.0

Теперь поддерживается параметр windowsHide.

v0.1.90

Добавлено в: v0.1.90

  • command <string> Команда для запуска с аргументами, разделёнными пробелами.
  • options <Object>
    • cwd <string> | <URL> Текущий рабочий каталог дочернего процесса. По умолчанию: process.cwd().
    • env <Object> Пары «ключ-значение» переменных среды. По умолчанию: process.env.
    • encoding <string> По умолчанию: 'utf8'
    • shell <string> Оболочка для выполнения команды. См. разделы Требования к оболочке и Оболочка Windows по умолчанию. По умолчанию: '/bin/sh' в Unix, process.env.ComSpec в Windows.
    • signal <AbortSignal> позволяет прервать дочерний процесс с помощью AbortSignal.
    • timeout <number> По умолчанию: 0
    • maxBuffer <number> Максимальный объём данных в байтах, разрешённый для stdout или stderr. При превышении этого значения дочерний процесс завершается, а все выходные данные усекаются. См. примечание в разделе maxBuffer и Unicode. По умолчанию: 1024 * 1024.
    • killSignal <string> | <integer> По умолчанию: 'SIGTERM'
    • uid <number> Задаёт идентификатор пользователя процесса (см. setuid(2)).
    • gid <number> Задаёт идентификатор группы процесса (см. setgid(2)).
    • windowsHide <boolean> Скрывает окно консоли подпроцесса, которое обычно создаётся в системах Windows. По умолчанию: false.
  • callback <Function> вызываемая с выходными данными после завершения процесса.
    • error <Error>
    • stdout <string> | <Buffer>
    • stderr <string> | <Buffer>
  • Возвращает: <ChildProcess>

Запускает оболочку, а затем выполняет в ней command, буферизуя все сгенерированные выходные данные. Строка command, передаваемая функции exec, обрабатывается непосредственно оболочкой, поэтому специальные символы (набор зависит от оболочки) необходимо обрабатывать соответствующим образом:

CommonJS
const { exec } = require('node:child_process');

exec('"/path/to/test file/test.sh" arg1 arg2');
// Double quotes are used so that the space in the path is not interpreted as
// a delimiter of multiple arguments.

exec('echo "The \\$HOME variable is $HOME"');
// The $HOME variable is escaped in the first instance, but not in the second.
Модули JavaScript
import { exec } from 'node:child_process';

exec('"/path/to/test file/test.sh" arg1 arg2');
// Double quotes are used so that the space in the path is not interpreted as
// a delimiter of multiple arguments.

exec('echo "The \\$HOME variable is $HOME"');
// The $HOME variable is escaped in the first instance, but not in the second.

Никогда не передавайте этой функции необработанные пользовательские данные. Любые данные, содержащие метасимволы оболочки, могут использоваться для выполнения произвольных команд.

Если указана функция callback, она вызывается с аргументами (error, stdout, stderr). В случае успеха error будет иметь значение null. В случае ошибки error будет экземпляром Error. Свойство error.code будет содержать код завершения процесса. По соглашению любой код завершения, отличный от 0, указывает на ошибку. error.signal будет содержать сигнал, завершивший процесс.

Аргументы stdout и stderr, передаваемые функции обратного вызова, содержат выходные данные stdout и stderr дочернего процесса. По умолчанию Node.js декодирует выходные данные в UTF-8 и передаёт функции обратного вызова строки. Параметр encoding можно использовать для указания кодировки символов, применяемой при декодировании выходных данных stdout и stderr. Если encoding имеет значение 'buffer' или указывает на неизвестную кодировку символов, вместо этого функции обратного вызова будут переданы объекты Buffer.

CommonJS
const { exec } = require('node:child_process');
exec('cat *.js missing_file | wc -l', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }
  console.log(`stdout: ${stdout}`);
  console.error(`stderr: ${stderr}`);
});
Модули JavaScript
import { exec } from 'node:child_process';
exec('cat *.js missing_file | wc -l', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }
  console.log(`stdout: ${stdout}`);
  console.error(`stderr: ${stderr}`);
});

Если значение timeout больше 0, родительский процесс отправит сигнал, указанный в свойстве killSignal (по умолчанию — 'SIGTERM'), если дочерний процесс выполняется дольше timeout миллисекунд.

В отличие от системного вызова POSIX exec(3), child_process.exec() не заменяет текущий процесс и использует оболочку для выполнения команды.

Если этот метод вызывается как его версия с преобразованием в формат util.promisify(), он возвращает Promise для Object со свойствами stdout и stderr. Возвращённый экземпляр ChildProcess прикрепляется к Promise как свойство child. В случае ошибки (включая любую ошибку, приводящую к коду завершения, отличному от 0) возвращается отклонённый промис с тем же объектом error, что и в функции обратного вызова, но с двумя дополнительными свойствами stdout и stderr.

CommonJS
const util = require('node:util');
const exec = util.promisify(require('node:child_process').exec);

async function lsExample() {
  const { stdout, stderr } = await exec('ls');
  console.log('stdout:', stdout);
  console.error('stderr:', stderr);
}
lsExample();
Модули JavaScript
import { promisify } from 'node:util';
import child_process from 'node:child_process';
const exec = promisify(child_process.exec);

async function lsExample() {
  const { stdout, stderr } = await exec('ls');
  console.log('stdout:', stdout);
  console.error('stderr:', stderr);
}
lsExample();

Если параметр signal включён, вызов .abort() для соответствующего AbortController аналогичен вызову .kill() для дочернего процесса, за исключением того, что ошибка, передаваемая функции обратного вызова, будет иметь тип AbortError:

CommonJS
const { exec } = require('node:child_process');
const controller = new AbortController();
const { signal } = controller;
const child = exec('grep ssh', { signal }, (error) => {
  console.error(error); // an AbortError
});
controller.abort();
Модули JavaScript
import { exec } from 'node:child_process';
const controller = new AbortController();
const { signal } = controller;
const child = exec('grep ssh', { signal }, (error) => {
  console.error(error); // an AbortError
});
controller.abort();

child_process.execFile(file[, args][, options][, callback])

История
Версия Изменения
v23.11.0, v22.15.0

Передача args при значении shell, равном true, объявлена устаревшей.

v16.4.0, v14.18.0

Параметр cwd может иметь тип WHATWG URL с использованием протокола file:.

v15.4.0, v14.17.0

Добавлена поддержка AbortSignal.

v8.8.0

Теперь поддерживается параметр windowsHide.

v0.1.91

Добавлено в: v0.1.91

  • file <string> Имя или путь к исполняемому файлу для запуска.
  • args <string[]> Список строковых аргументов.
  • options <Object>
    • cwd <string> | <URL> Текущий рабочий каталог дочернего процесса.
    • env <Object> Пары «ключ-значение» переменных среды. По умолчанию: process.env.
    • encoding <string> По умолчанию: 'utf8'
    • timeout <number> По умолчанию: 0
    • maxBuffer <number> Максимальный объём данных в байтах, разрешённый для stdout или stderr. При превышении этого значения дочерний процесс завершается, а все выходные данные усекаются. См. примечание в разделе maxBuffer и Unicode. По умолчанию: 1024 * 1024.
    • killSignal <string> | <integer> По умолчанию: 'SIGTERM'
    • uid <number> Задаёт идентификатор пользователя процесса (см. setuid(2)).
    • gid <number> Задаёт идентификатор группы процесса (см. setgid(2)).
    • windowsHide <boolean> Скрывает окно консоли подпроцесса, которое обычно создаётся в системах Windows. По умолчанию: false.
    • windowsVerbatimArguments <boolean> В Windows аргументы не заключаются в кавычки и не экранируются. В Unix игнорируется. По умолчанию: false.
    • shell <boolean> | <string> Если значение true, запускает command в оболочке. В Unix используется '/bin/sh', а в Windows — process.env.ComSpec. Оболочку можно задать в виде строки. См. разделы Требования к оболочке и Оболочка Windows по умолчанию. По умолчанию: false (без оболочки).
    • signal <AbortSignal> позволяет прервать дочерний процесс с помощью AbortSignal.
  • callback <Function> Вызывается с выходными данными после завершения процесса.
    • error <Error>
    • stdout <string> | <Buffer>
    • stderr <string> | <Buffer>
  • Возвращает: <ChildProcess>

Функция child_process.execFile() похожа на child_process.exec(), но по умолчанию не запускает оболочку. Вместо этого указанный исполняемый файл file запускается непосредственно как новый процесс, что делает этот метод немного эффективнее, чем child_process.exec().

Поддерживаются те же параметры, что и для child_process.exec(). Поскольку оболочка не запускается, такие возможности, как перенаправление ввода-вывода и подстановка имён файлов, не поддерживаются.

CommonJS
const { execFile } = require('node:child_process');
const child = execFile('node', ['--version'], (error, stdout, stderr) => {
  if (error) {
    throw error;
  }
  console.log(stdout);
});
Модули JavaScript
import { execFile } from 'node:child_process';
const child = execFile('node', ['--version'], (error, stdout, stderr) => {
  if (error) {
    throw error;
  }
  console.log(stdout);
});

Аргументы stdout и stderr, передаваемые функции обратного вызова, содержат выходные данные stdout и stderr дочернего процесса. По умолчанию Node.js декодирует выходные данные в UTF-8 и передаёт функции обратного вызова строки. Параметр encoding можно использовать для указания кодировки символов, применяемой при декодировании выходных данных stdout и stderr. Если encoding имеет значение 'buffer' или указывает на неизвестную кодировку символов, вместо этого функции обратного вызова будут переданы объекты Buffer.

Если этот метод вызывается как его версия с преобразованием в формат util.promisify(), он возвращает Promise для Object со свойствами stdout и stderr. Возвращённый экземпляр ChildProcess прикрепляется к Promise как свойство child. В случае ошибки (включая любую ошибку, приводящую к коду завершения, отличному от 0) возвращается отклонённый промис с тем же объектом error, что и в функции обратного вызова, но с двумя дополнительными свойствами stdout и stderr.

CommonJS
const util = require('node:util');
const execFile = util.promisify(require('node:child_process').execFile);
async function getVersion() {
  const { stdout } = await execFile('node', ['--version']);
  console.log(stdout);
}
getVersion();
Модули JavaScript
import { promisify } from 'node:util';
import child_process from 'node:child_process';
const execFile = promisify(child_process.execFile);
async function getVersion() {
  const { stdout } = await execFile('node', ['--version']);
  console.log(stdout);
}
getVersion();

Если параметр shell включён, не передавайте этой функции необработанные пользовательские данные. Любые данные, содержащие метасимволы оболочки, могут использоваться для выполнения произвольных команд.

Если параметр signal включён, вызов .abort() для соответствующего AbortController аналогичен вызову .kill() для дочернего процесса, за исключением того, что ошибка, передаваемая функции обратного вызова, будет иметь тип AbortError:

CommonJS
const { execFile } = require('node:child_process');
const controller = new AbortController();
const { signal } = controller;
const child = execFile('node', ['--version'], { signal }, (error) => {
  console.error(error); // an AbortError
});
controller.abort();
Модули JavaScript
import { execFile } from 'node:child_process';
const controller = new AbortController();
const { signal } = controller;
const child = execFile('node', ['--version'], { signal }, (error) => {
  console.error(error); // an AbortError
});
controller.abort();

child_process.fork(modulePath[, args][, options])

История
Версия Изменения
v17.4.0, v16.14.0

Параметр modulePath может иметь тип WHATWG URL с использованием протокола file:.

v16.4.0, v14.18.0

Параметр cwd может иметь тип WHATWG URL с использованием протокола file:.

v15.13.0, v14.18.0

Добавлен параметр timeout.

v15.11.0, v14.18.0

Добавлен параметр killSignal для AbortSignal.

v15.6.0, v14.17.0

Добавлена поддержка AbortSignal.

v13.2.0, v12.16.0

Теперь поддерживается параметр serialization.

v8.0.0

Теперь параметр stdio может иметь тип string.

v6.4.0

Теперь поддерживается параметр stdio.

v0.5.0

Добавлено в: v0.5.0

  • modulePath <string> | <URL> Модуль, который будет запущен в дочернем процессе.
  • args <string[]> Список строковых аргументов.
  • options <Object>
    • cwd <string> | <URL> Текущий рабочий каталог дочернего процесса.
    • detached <boolean> Подготавливает дочерний процесс к независимому от родительского процесса запуску. Конкретное поведение зависит от платформы (см. options.detached).
    • env <Object> Пары «ключ-значение» переменных среды. По умолчанию: process.env.
    • execPath <string> Исполняемый файл, используемый для создания дочернего процесса.
    • execArgv <string[]> Список строковых аргументов, передаваемых исполняемому файлу. По умолчанию: process.execArgv.
    • gid <number> Задаёт идентификатор группы процесса (см. setgid(2)).
    • serialization <string> Указывает тип сериализации, используемый для передачи сообщений между процессами. Возможные значения: 'json' и 'advanced'. Подробнее см. раздел Расширенная сериализация. По умолчанию: 'json'.
    • signal <AbortSignal> Позволяет закрыть дочерний процесс с помощью AbortSignal.
    • killSignal <string> | <integer> Значение сигнала, используемое для завершения запущенного процесса по истечении времени ожидания или при получении сигнала прерывания. По умолчанию: 'SIGTERM'.
    • silent <boolean> Если значение true, потоки stdin, stdout и stderr дочернего процесса будут подключены к родительскому процессу; в противном случае они будут унаследованы от родительского процесса. Подробнее см. параметры 'pipe' и 'inherit' раздела stdio метода child_process.spawn(). По умолчанию: false.
    • stdio <Array> | <string> См. раздел stdio метода child_process.spawn(). Если этот параметр указан, он переопределяет silent. Если используется вариант с массивом, он должен содержать ровно один элемент со значением 'ipc', иначе будет вызвана ошибка. Например, [0, 1, 2, 'ipc'].
    • uid <number> Задаёт идентификатор пользователя процесса (см. setuid(2)).
    • windowsVerbatimArguments <boolean> В Windows аргументы не заключаются в кавычки и не экранируются. В Unix игнорируется. По умолчанию: false.
    • timeout <number> Максимальное время выполнения процесса в миллисекундах. По умолчанию: undefined.
  • Возвращает: <ChildProcess>

Метод child_process.fork() — это особый случай метода child_process.spawn(), предназначенный специально для запуска новых процессов Node.js. Как и child_process.spawn(), он возвращает объект ChildProcess. Возвращённый объект ChildProcess имеет встроенный дополнительный канал связи, позволяющий обмениваться сообщениями между родительским и дочерним процессами. Подробнее см. subprocess.send().

Следует помнить, что запущенные дочерние процессы Node.js независимы от родительского, за исключением установленного между ними канала связи IPC. У каждого процесса собственная память и собственный экземпляр V8. Из-за дополнительных затрат на выделение ресурсов не рекомендуется запускать большое количество дочерних процессов Node.js.

По умолчанию child_process.fork() запускает новые экземпляры Node.js, используя process.execPath родительского процесса. Свойство execPath объекта options позволяет указать альтернативный путь к исполняемому файлу.

Процессы Node.js, запущенные с пользовательским значением execPath, взаимодействуют с родительским процессом через файловый дескриптор (fd), идентификатор которого задаётся переменной среды NODE_CHANNEL_FD дочернего процесса.

В отличие от системного вызова POSIX fork(2), child_process.fork() не клонирует текущий процесс.

Параметр shell, доступный в child_process.spawn(), не поддерживается методом child_process.fork() и игнорируется, если он задан.

Если параметр signal включён, вызов .abort() для соответствующего AbortController аналогичен вызову .kill() для дочернего процесса, за исключением того, что ошибка, передаваемая функции обратного вызова, будет иметь тип AbortError:

CommonJS
const { fork } = require('node:child_process');
const process = require('node:process');

if (process.argv[2] === 'child') {
  setTimeout(() => {
    console.log(`Hello from ${process.argv[2]}!`);
  }, 1_000);
} else {
  const controller = new AbortController();
  const { signal } = controller;
  const child = fork(__filename, ['child'], { signal });
  child.on('error', (err) => {
    // This will be called with err being an AbortError if the controller aborts
  });
  controller.abort(); // Stops the child process
}
Модули JavaScript
import { fork } from 'node:child_process';
import process from 'node:process';

if (process.argv[2] === 'child') {
  setTimeout(() => {
    console.log(`Hello from ${process.argv[2]}!`);
  }, 1_000);
} else {
  const controller = new AbortController();
  const { signal } = controller;
  const child = fork(import.meta.url, ['child'], { signal });
  child.on('error', (err) => {
    // This will be called with err being an AbortError if the controller aborts
  });
  controller.abort(); // Stops the child process
}

child_process.spawn(command[, args][, options])

История
Версия Изменения
v23.11.0, v22.15.0

Передача args при установленном значении shell равном true объявлена устаревшей.

v16.4.0, v14.18.0

Параметр cwd теперь может принимать объект WHATWG URL с использованием протокола file:.

v15.13.0, v14.18.0

Добавлен параметр timeout.

v15.11.0, v14.18.0

Добавлен killSignal для AbortSignal.

v15.5.0, v14.17.0

Добавлена поддержка AbortSignal.

v13.2.0, v12.16.0

Теперь поддерживается параметр serialization.

v8.8.0

Теперь поддерживается параметр windowsHide.

v6.4.0

Теперь поддерживается параметр argv0.

v5.7.0

Теперь поддерживается параметр shell.

v0.1.90

Добавлено в: v0.1.90

  • command <string> Команда для выполнения.
  • args <string[]> Список строковых аргументов.
  • options <Object>
    • cwd <string> | <URL> Текущий рабочий каталог дочернего процесса.
    • env <Object> Пары ключ-значение окружения. По умолчанию: process.env.
    • argv0 <string> Явно задаёт значение argv[0], передаваемое дочернему процессу. Если оно не указано, будет установлено значение command.
    • stdio <Array> | <string> Конфигурация stdio дочернего процесса (см. options.stdio).
    • detached <boolean> Подготавливает дочерний процесс к независимому от родительского процесса выполнению. Конкретное поведение зависит от платформы (см. options.detached).
    • uid <number> Задаёт идентификатор пользователя процесса (см. setuid(2)).
    • gid <number> Задаёт идентификатор группы процесса (см. setgid(2)).
    • serialization <string> Указывает тип сериализации для передачи сообщений между процессами. Возможные значения: 'json' и 'advanced'. Подробнее см. в разделе Расширенная сериализация. По умолчанию: 'json'.
    • shell <boolean> | <string> Если значение true, запускает command в оболочке. В Unix используется '/bin/sh', а в Windows — process.env.ComSpec. Можно указать другую оболочку в виде строки. См. разделы Требования к оболочке и Оболочка Windows по умолчанию. По умолчанию: false (без оболочки).
    • windowsVerbatimArguments <boolean> В Windows аргументы не заключаются в кавычки и не экранируются. В Unix игнорируется. Автоматически получает значение true, если указан shell и это CMD. По умолчанию: false.
    • windowsHide <boolean> Скрывает консольное окно подпроцесса, которое обычно создаётся в системах Windows. По умолчанию: false.
    • signal <AbortSignal> позволяет прервать дочерний процесс с помощью AbortSignal.
    • timeout <number> Максимальное время выполнения процесса в миллисекундах. По умолчанию: undefined.
    • killSignal <string> | <integer> Значение сигнала, используемого для завершения порождённого процесса по тайм-ауту или сигналу прерывания. По умолчанию: 'SIGTERM'.
  • Возвращает: <ChildProcess>

Метод child_process.spawn() порождает новый процесс с помощью указанной command и передаёт ему аргументы командной строки из args. Если args не указано, по умолчанию используется пустой массив.

Если включён параметр shell, не передавайте этой функции необработанные пользовательские данные. Любые данные, содержащие метасимволы оболочки, могут быть использованы для выполнения произвольных команд.

Третий аргумент можно использовать для указания дополнительных параметров со следующими значениями по умолчанию:

const defaults = {
  cwd: undefined,
  env: process.env,
}; copy

Используйте cwd, чтобы указать рабочий каталог, из которого запускается процесс. Если он не задан, по умолчанию используется текущий рабочий каталог. Если каталог указан, но не существует, дочерний процесс генерирует ошибку ENOENT и немедленно завершается. Событие ENOENT также генерируется, если команда не существует.

Используйте env, чтобы указать переменные окружения, доступные новому процессу. По умолчанию используется process.env.

Значения undefined в env будут игнорироваться.

Пример запуска ls -lh /usr со сбором stdout, stderr и кода завершения:

CommonJS
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(`child process exited with code ${code}`);
});
Модули JavaScript
import { spawn } from 'node:child_process';
import { once } from 'node:events';
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

const [code] = await once(ls, 'close');
console.log(`child process exited with code ${code}`);

Пример: весьма сложный способ запуска ps ax | grep ssh

CommonJS
const { spawn } = require('node:child_process');
const ps = spawn('ps', ['ax']);
const grep = spawn('grep', ['ssh']);

ps.stdout.on('data', (data) => {
  grep.stdin.write(data);
});

ps.stderr.on('data', (data) => {
  console.error(`ps stderr: ${data}`);
});

ps.on('close', (code) => {
  if (code !== 0) {
    console.log(`ps process exited with code ${code}`);
  }
  grep.stdin.end();
});

grep.stdout.on('data', (data) => {
  console.log(data.toString());
});

grep.stderr.on('data', (data) => {
  console.error(`grep stderr: ${data}`);
});

grep.on('close', (code) => {
  if (code !== 0) {
    console.log(`grep process exited with code ${code}`);
  }
});
Модули JavaScript
import { spawn } from 'node:child_process';
const ps = spawn('ps', ['ax']);
const grep = spawn('grep', ['ssh']);

ps.stdout.on('data', (data) => {
  grep.stdin.write(data);
});

ps.stderr.on('data', (data) => {
  console.error(`ps stderr: ${data}`);
});

ps.on('close', (code) => {
  if (code !== 0) {
    console.log(`ps process exited with code ${code}`);
  }
  grep.stdin.end();
});

grep.stdout.on('data', (data) => {
  console.log(data.toString());
});

grep.stderr.on('data', (data) => {
  console.error(`grep stderr: ${data}`);
});

grep.on('close', (code) => {
  if (code !== 0) {
    console.log(`grep process exited with code ${code}`);
  }
});

Пример проверки ошибок при выполнении spawn:

CommonJS
const { spawn } = require('node:child_process');
const subprocess = spawn('bad_command');

subprocess.on('error', (err) => {
  console.error('Failed to start subprocess.');
});
Модули JavaScript
import { spawn } from 'node:child_process';
const subprocess = spawn('bad_command');

subprocess.on('error', (err) => {
  console.error('Failed to start subprocess.');
});

Некоторые платформы (macOS, Linux) используют значение argv[0] в качестве заголовка процесса, а другие (Windows, SunOS) используют command.

При запуске Node.js перезаписывает argv[0] значением process.execPath, поэтому process.argv[0] в дочернем процессе Node.js не будет соответствовать параметру argv0, переданному родительским процессом в spawn. Вместо этого получите его с помощью свойства process.argv0.

Если включён параметр signal, вызов .abort() для соответствующего AbortController аналогичен вызову .kill() для дочернего процесса, за исключением того, что ошибка, передаваемая обратному вызову, будет иметь тип AbortError:

CommonJS
const { spawn } = require('node:child_process');
const controller = new AbortController();
const { signal } = controller;
const grep = spawn('grep', ['ssh'], { signal });
grep.on('error', (err) => {
  // This will be called with err being an AbortError if the controller aborts
});
controller.abort(); // Stops the child process
Модули JavaScript
import { spawn } from 'node:child_process';
const controller = new AbortController();
const { signal } = controller;
const grep = spawn('grep', ['ssh'], { signal });
grep.on('error', (err) => {
  // This will be called with err being an AbortError if the controller aborts
});
controller.abort(); // Stops the child process
options.detached
Добавлено в: v0.7.10

В Windows установка options.detached в значение true позволяет дочернему процессу продолжать работу после завершения родительского процесса. У дочернего процесса будет собственное консольное окно. После включения этот параметр нельзя отключить.

На платформах, отличных от Windows, если options.detached имеет значение true, дочерний процесс становится лидером новой группы процессов и сеанса. Дочерние процессы могут продолжать работу после завершения родительского процесса независимо от того, были ли они отсоединены. Дополнительные сведения см. в setsid(2).

По умолчанию родительский процесс ожидает завершения отсоединённого дочернего процесса. Чтобы родительский процесс не ожидал завершения заданного subprocess, используйте метод subprocess.unref(). В результате дочерний процесс не будет учитываться в счётчике ссылок цикла событий родительского процесса, что позволит родительскому процессу завершиться независимо от дочернего, если между дочерним и родительским процессами не установлен канал IPC.

При использовании параметра detached для запуска длительно работающего процесса он не продолжит работу в фоновом режиме после завершения родительского процесса, если ему не будет предоставлена конфигурация stdio, не связанная с родительским процессом. Если stdio родительского процесса унаследован, дочерний процесс останется подключённым к управляющему терминалу.

Пример длительно работающего процесса: отсоединение и игнорирование файловых дескрипторов stdio родительского процесса, чтобы процесс не завершался вместе с родителем:

CommonJS
const { spawn } = require('node:child_process');
const process = require('node:process');

const subprocess = spawn(process.argv[0], ['child_program.js'], {
  detached: true,
  stdio: 'ignore',
});

subprocess.unref();
Модули JavaScript
import { spawn } from 'node:child_process';
import process from 'node:process';

const subprocess = spawn(process.argv[0], ['child_program.js'], {
  detached: true,
  stdio: 'ignore',
});

subprocess.unref();

В качестве альтернативы можно перенаправить вывод дочернего процесса в файлы:

CommonJS
const { openSync } = require('node:fs');
const { spawn } = require('node:child_process');
const out = openSync('./out.log', 'a');
const err = openSync('./out.log', 'a');

const subprocess = spawn('prg', [], {
  detached: true,
  stdio: [ 'ignore', out, err ],
});

subprocess.unref();
Модули JavaScript
import { openSync } from 'node:fs';
import { spawn } from 'node:child_process';
const out = openSync('./out.log', 'a');
const err = openSync('./out.log', 'a');

const subprocess = spawn('prg', [], {
  detached: true,
  stdio: [ 'ignore', out, err ],
});

subprocess.unref();
options.stdio
История
Версия Изменения
v15.6.0, v14.18.0

Добавлен флаг stdio overlapped.

v3.3.1

Значение 0 теперь принимается в качестве файлового дескриптора.

v0.7.10

Добавлено в: v0.7.10

Параметр options.stdio используется для настройки каналов, устанавливаемых между родительским и дочерним процессами. По умолчанию stdin, stdout и stderr дочернего процесса перенаправляются в соответствующие потоки subprocess.stdin, subprocess.stdout и subprocess.stderr объекта ChildProcess. Это эквивалентно установке options.stdio в значение ['pipe', 'pipe', 'pipe'].

Для удобства options.stdio может принимать одну из следующих строк:

  • 'pipe': эквивалентно ['pipe', 'pipe', 'pipe'] (значение по умолчанию)
  • 'overlapped': эквивалентно ['overlapped', 'overlapped', 'overlapped']
  • 'ignore': эквивалентно ['ignore', 'ignore', 'ignore']
  • 'inherit': эквивалентно ['inherit', 'inherit', 'inherit'] или [0, 1, 2]

В противном случае значением options.stdio является массив, в котором каждый индекс соответствует файловому дескриптору дочернего процесса. Дескрипторы 0, 1 и 2 соответствуют stdin, stdout и stderr соответственно. Можно указать дополнительные дескрипторы, чтобы создать дополнительные каналы между родительским и дочерним процессами. Значение может быть одним из следующих:

  1. 'pipe': создаёт канал между дочерним и родительским процессами. Родительская сторона канала доступна родительскому процессу как свойство объекта child_process под именем subprocess.stdio[fd]. Каналы, созданные для дескрипторов 0, 1 и 2, также доступны как subprocess.stdin, subprocess.stdout и subprocess.stderr соответственно. Это не настоящие каналы Unix, поэтому дочерний процесс не может использовать их через файловые дескрипторы, например /dev/fd/2 или /dev/stdout.

  2. 'overlapped': то же, что и 'pipe', но для дескриптора устанавливается флаг FILE_FLAG_OVERLAPPED. Это необходимо для перекрывающегося ввода-вывода с дескрипторами stdio дочернего процесса. Подробнее см. в документации. В системах, отличных от Windows, это полностью эквивалентно 'pipe'.

  3. 'ipc': создаёт канал IPC для передачи сообщений и файловых дескрипторов между родительским и дочерним процессами. У ChildProcess может быть не более одного файлового дескриптора stdio для IPC. Установка этого параметра включает метод subprocess.send(). Если дочерний процесс является экземпляром Node.js, наличие канала IPC включает методы process.send() и process.disconnect(), а также события 'disconnect' и 'message' в дочернем процессе.

    Доступ к файловому дескриптору канала IPC любым способом, кроме process.send(), а также использование канала IPC с дочерним процессом, который не является экземпляром Node.js, не поддерживается.

  4. 'ignore': указывает Node.js игнорировать дескриптор в дочернем процессе. Хотя Node.js всегда открывает дескрипторы 0, 1 и 2 для порождаемых процессов, установка для дескриптора значения 'ignore' приводит к тому, что Node.js открывает /dev/null и подключает его к дескриптору дочернего процесса.

  5. 'inherit': передаёт соответствующий поток stdio от родительского процесса или в него. В первых трёх позициях это эквивалентно process.stdin, process.stdout и process.stderr соответственно. В любой другой позиции эквивалентно 'ignore'.

  6. Объект <Stream>: совместно использует с дочерним процессом поток для чтения или записи, связанный с tty, файлом, сокетом или каналом. Базовый файловый дескриптор потока дублируется в дочернем процессе для дескриптора, соответствующего индексу в массиве stdio. У потока должен быть базовый дескриптор (файловые потоки не запускаются до наступления события 'open'). ПРИМЕЧАНИЕ: Хотя технически можно передать stdin как поток для записи или stdout/stderr как поток для чтения, делать это не рекомендуется. Потоки для чтения и записи имеют разное поведение, и их неправильное использование (например, передача потока для чтения там, где ожидается поток для записи) может привести к неожиданным результатам или ошибкам. Такая практика не рекомендуется, поскольку при возникновении ошибок в потоке она может привести к неопределённому поведению или пропуску обратных вызовов. Чтобы сохранить предполагаемый поток данных между родительским и дочерним процессами, всегда используйте stdin для чтения, а stdout/stderr — для записи.

  7. Положительное целое число: целое значение интерпретируется как файловый дескриптор, открытый в родительском процессе. Он совместно используется с дочерним процессом, аналогично объектам <Stream>. Передача сокетов в Windows не поддерживается.

  8. null, undefined: используется значение по умолчанию. Для файловых дескрипторов stdio 0, 1 и 2 (то есть stdin, stdout и stderr) создаётся канал. Для дескрипторов 3 и выше по умолчанию используется 'ignore'.

CommonJS
const { spawn } = require('node:child_process');
const process = require('node:process');

// Child will use parent's stdios.
spawn('prg', [], { stdio: 'inherit' });

// Spawn child sharing only stderr.
spawn('prg', [], { stdio: ['pipe', 'pipe', process.stderr] });

// Open an extra fd=4, to interact with programs presenting a
// startd-style interface.
spawn('prg', [], { stdio: ['pipe', null, null, null, 'pipe'] });
Модули JavaScript
import { spawn } from 'node:child_process';
import process from 'node:process';

// Child will use parent's stdios.
spawn('prg', [], { stdio: 'inherit' });

// Spawn child sharing only stderr.
spawn('prg', [], { stdio: ['pipe', 'pipe', process.stderr] });

// Open an extra fd=4, to interact with programs presenting a
// startd-style interface.
spawn('prg', [], { stdio: ['pipe', null, null, null, 'pipe'] });

Следует отметить, что при установке канала IPC между родительским и дочерним процессами, если дочерний процесс является экземпляром Node.js, он запускается с неучитываемым каналом IPC (с помощью unref()) до тех пор, пока дочерний процесс не зарегистрирует обработчик события 'disconnect' или события 'message'. Благодаря этому дочерний процесс может нормально завершиться, не оставаясь активным из-за открытого канала IPC. См. также: child_process.exec() и child_process.fork().

Синхронное создание процесса

Методы child_process.spawnSync(), child_process.execSync() и child_process.execFileSync() являются синхронными и блокируют цикл событий Node.js, приостанавливая выполнение любого дополнительного кода до завершения созданного процесса.

Блокирующие вызовы, подобные этим, полезны главным образом для упрощения задач написания скриптов общего назначения, а также загрузки и обработки конфигурации приложения при запуске.

child_process.execFileSync(file[, args][, options])

История
Версия Изменения
v16.4.0, v14.18.0

Параметр cwd может быть объектом WHATWG URL с использованием протокола file:.

v10.10.0

Теперь параметр input может иметь тип TypedArray или DataView.

v8.8.0

Теперь поддерживается параметр windowsHide.

v8.0.0

Теперь параметр input может иметь тип Uint8Array.

v6.2.1, v4.5.0

Теперь параметру encoding можно явно присвоить значение buffer.

v0.11.12

Добавлено в: v0.11.12

  • file <string> Имя или путь к исполняемому файлу для запуска.
  • args <string[]> Список строковых аргументов.
  • options <Object>
    • cwd <string> | <URL> Текущий рабочий каталог дочернего процесса.
    • input <string> | <Buffer> | <TypedArray> | <DataView> Значение, которое будет передано в stdin созданного процесса. Если для stdio[0] задано значение 'pipe', это значение переопределит stdio[0].
    • stdio <string> | <Array> Настройка stdio дочернего процесса. См. параметр stdio метода child_process.spawn(). По умолчанию stderr будет выведен в stderr родительского процесса, если не указан stdio. По умолчанию: 'pipe'.
    • env <Object> Пары ключ-значение переменных окружения. По умолчанию: process.env.
    • uid <number> Задает идентификатор пользователя процесса (см. setuid(2)).
    • gid <number> Задает идентификатор группы процесса (см. setgid(2)).
    • timeout <number> Максимальное время выполнения процесса в миллисекундах. По умолчанию: undefined.
    • killSignal <string> | <integer> Значение сигнала, которое будет использоваться при завершении созданного процесса. По умолчанию: 'SIGTERM'.
    • maxBuffer <number> Максимальный объем данных в байтах, допустимый для stdout или stderr. При превышении этого значения дочерний процесс завершается. См. примечание в разделе maxBuffer и Unicode. По умолчанию: 1024 * 1024.
    • encoding <string> Кодировка, используемая для всех входных и выходных данных stdio. По умолчанию: 'buffer'.
    • windowsHide <boolean> Скрывает окно консоли подпроцесса, которое обычно создается в системах Windows. По умолчанию: false.
    • shell <boolean> | <string> Если задано значение true, запускает command в оболочке. В Unix используется '/bin/sh', а в Windows — process.env.ComSpec. В качестве строки можно указать другую оболочку. См. разделы Требования к оболочке и Оболочка Windows по умолчанию. По умолчанию: false (без оболочки).
  • Возвращает: <Buffer> | <string> Вывод команды в stdout.

Метод child_process.execFileSync() в целом идентичен методу child_process.execFile(), за исключением того, что он не возвращает управление, пока дочерний процесс не завершится полностью. Если наступил тайм-аут и был отправлен killSignal, метод не вернет управление, пока процесс не завершится полностью.

Если дочерний процесс перехватывает сигнал SIGTERM и обрабатывает его, не завершаясь, родительский процесс все равно будет ждать завершения дочернего процесса.

Если время ожидания процесса истекло или он завершился с ненулевым кодом выхода, этот метод вызовет исключение Error, которое будет содержать полный результат базового вызова child_process.spawnSync().

Если включен параметр shell, не передавайте этой функции неочищенные пользовательские данные. Любые данные, содержащие метасимволы оболочки, могут использоваться для выполнения произвольных команд.

CommonJS
const { execFileSync } = require('node:child_process');

try {
  const stdout = execFileSync('my-script.sh', ['my-arg'], {
    // Capture stdout and stderr from child process. Overrides the
    // default behavior of streaming child stderr to the parent stderr
    stdio: 'pipe',

    // Use utf8 encoding for stdio pipes
    encoding: 'utf8',
  });

  console.log(stdout);
} catch (err) {
  if (err.code) {
    // Spawning child process failed
    console.error(err.code);
  } else {
    // Child was spawned but exited with non-zero exit code
    // Error contains any stdout and stderr from the child
    const { stdout, stderr } = err;

    console.error({ stdout, stderr });
  }
}
Модули JavaScript
import { execFileSync } from 'node:child_process';

try {
  const stdout = execFileSync('my-script.sh', ['my-arg'], {
    // Capture stdout and stderr from child process. Overrides the
    // default behavior of streaming child stderr to the parent stderr
    stdio: 'pipe',

    // Use utf8 encoding for stdio pipes
    encoding: 'utf8',
  });

  console.log(stdout);
} catch (err) {
  if (err.code) {
    // Spawning child process failed
    console.error(err.code);
  } else {
    // Child was spawned but exited with non-zero exit code
    // Error contains any stdout and stderr from the child
    const { stdout, stderr } = err;

    console.error({ stdout, stderr });
  }
}

child_process.execSync(command[, options])

История
Версия Изменения
v16.4.0, v14.18.0

Параметр cwd может быть объектом WHATWG URL с использованием протокола file:.

v10.10.0

Теперь параметр input может иметь тип TypedArray или DataView.

v8.8.0

Теперь поддерживается параметр windowsHide.

v8.0.0

Теперь параметр input может иметь тип Uint8Array.

v0.11.12

Добавлено в: v0.11.12

  • command <string> Команда для запуска.
  • options <Object>
    • cwd <string> | <URL> Текущий рабочий каталог дочернего процесса.
    • input <string> | <Buffer> | <TypedArray> | <DataView> Значение, которое будет передано в stdin созданного процесса. Если для stdio[0] задано значение 'pipe', это значение переопределит stdio[0].
    • stdio <string> | <Array> Настройка stdio дочернего процесса. См. параметр stdio метода child_process.spawn(). По умолчанию stderr будет выведен в stderr родительского процесса, если не указан stdio. По умолчанию: 'pipe'.
    • env <Object> Пары ключ-значение переменных окружения. По умолчанию: process.env.
    • shell <string> Оболочка для выполнения команды. См. разделы Требования к оболочке и Оболочка Windows по умолчанию. По умолчанию: '/bin/sh' в Unix, process.env.ComSpec в Windows.
    • uid <number> Задает идентификатор пользователя процесса (см. setuid(2)).
    • gid <number> Задает идентификатор группы процесса (см. setgid(2)).
    • timeout <number> Максимальное время выполнения процесса в миллисекундах. По умолчанию: undefined.
    • killSignal <string> | <integer> Значение сигнала, которое будет использоваться при завершении созданного процесса. По умолчанию: 'SIGTERM'.
    • maxBuffer <number> Максимальный объем данных в байтах, допустимый для stdout или stderr. При превышении этого значения дочерний процесс завершается, а весь вывод усекается. См. примечание в разделе maxBuffer и Unicode. По умолчанию: 1024 * 1024.
    • encoding <string> Кодировка, используемая для всех входных и выходных данных stdio. По умолчанию: 'buffer'.
    • windowsHide <boolean> Скрывает окно консоли подпроцесса, которое обычно создается в системах Windows. По умолчанию: false.
  • Возвращает: <Buffer> | <string> Вывод команды в stdout.

Метод child_process.execSync() в целом идентичен методу child_process.exec(), за исключением того, что он не возвращает управление, пока дочерний процесс не завершится полностью. Если наступил тайм-аут и был отправлен killSignal, метод не вернет управление, пока процесс не завершится полностью. Если дочерний процесс перехватывает сигнал SIGTERM и обрабатывает его, не завершаясь, родительский процесс будет ждать завершения дочернего процесса.

Если время ожидания процесса истекло или он завершился с ненулевым кодом выхода, этот метод вызовет исключение. Объект Error будет содержать полный результат вызова child_process.spawnSync().

Никогда не передавайте этой функции неочищенные пользовательские данные. Любые данные, содержащие метасимволы оболочки, могут использоваться для выполнения произвольных команд.

child_process.spawnSync(command[, args][, options])

История
Версия Изменения
v16.4.0, v14.18.0

Параметр cwd может быть объектом WHATWG URL с использованием протокола file:.

v10.10.0

Теперь параметр input может иметь тип TypedArray или DataView.

v8.8.0

Теперь поддерживается параметр windowsHide.

v8.0.0

Теперь параметр input может иметь тип Uint8Array.

v5.7.0

Теперь поддерживается параметр shell.

v6.2.1, v4.5.0

Теперь параметру encoding можно явно присвоить значение buffer.

v0.11.12

Добавлено в: v0.11.12

  • command <string> Команда для запуска.
  • args <string[]> Список строковых аргументов.
  • options <Object>
    • cwd <string> | <URL> Текущий рабочий каталог дочернего процесса.
    • input <string> | <Buffer> | <TypedArray> | <DataView> Значение, которое будет передано в stdin созданного процесса. Если для stdio[0] задано значение 'pipe', это значение переопределит stdio[0].
    • argv0 <string> Явно задает значение argv[0], передаваемое дочернему процессу. Если значение не указано, будет установлено command.
    • stdio <string> | <Array> Настройка stdio дочернего процесса. См. параметр stdio метода child_process.spawn(). По умолчанию: 'pipe'.
    • env <Object> Пары ключ-значение переменных окружения. По умолчанию: process.env.
    • uid <number> Задает идентификатор пользователя процесса (см. setuid(2)).
    • gid <number> Задает идентификатор группы процесса (см. setgid(2)).
    • timeout <number> Максимальное время выполнения процесса в миллисекундах. По умолчанию: undefined.
    • killSignal <string> | <integer> Значение сигнала, которое будет использоваться при завершении созданного процесса. По умолчанию: 'SIGTERM'.
    • maxBuffer <number> Максимальный объем данных в байтах, допустимый для stdout или stderr. При превышении этого значения дочерний процесс завершается, а весь вывод усекается. См. примечание в разделе maxBuffer и Unicode. По умолчанию: 1024 * 1024.
    • encoding <string> Кодировка, используемая для всех входных и выходных данных stdio. По умолчанию: 'buffer'.
    • shell <boolean> | <string> Если задано значение true, запускает command в оболочке. В Unix используется '/bin/sh', а в Windows — process.env.ComSpec. В качестве строки можно указать другую оболочку. См. разделы Требования к оболочке и Оболочка Windows по умолчанию. По умолчанию: false (без оболочки).
    • windowsVerbatimArguments <boolean> В Windows аргументы не заключаются в кавычки и не экранируются. В Unix игнорируется. Автоматически устанавливается в true, если указан shell и это CMD. По умолчанию: false.
    • windowsHide <boolean> Скрывает окно консоли подпроцесса, которое обычно создается в системах Windows. По умолчанию: false.
  • Возвращает: <Object>
    • pid <number> PID дочернего процесса.
    • output <Array> Массив результатов вывода stdio.
    • stdout <Buffer> | <string> Содержимое output[1].
    • stderr <Buffer> | <string> Содержимое output[2].
    • status <number> | <null> Код завершения подпроцесса или null, если подпроцесс завершился из-за сигнала.
    • signal <string> | <null> Сигнал, использованный для завершения подпроцесса, или null, если подпроцесс завершился не из-за сигнала.
    • error <Error> Объект ошибки, если дочерний процесс завершился с ошибкой или истекло время ожидания.

Метод child_process.spawnSync() в целом идентичен методу child_process.spawn(), за исключением того, что функция не возвращает управление, пока дочерний процесс не завершится полностью. Если наступил тайм-аут и был отправлен killSignal, метод не вернет управление, пока процесс не завершится полностью. Если процесс перехватывает сигнал SIGTERM и обрабатывает его, не завершаясь, родительский процесс будет ждать завершения дочернего процесса.

Если включен параметр shell, не передавайте этой функции неочищенные пользовательские данные. Любые данные, содержащие метасимволы оболочки, могут использоваться для выполнения произвольных команд.

Класс: ChildProcess

Добавлено в: v2.2.0
  • Наследует: <EventEmitter>

Экземпляры ChildProcess представляют порождённые дочерние процессы.

Экземпляры ChildProcess не предназначены для непосредственного создания. Вместо этого используйте методы child_process.spawn(), child_process.exec(), child_process.execFile() или child_process.fork() для создания экземпляров ChildProcess.

Событие: 'close'

Добавлено в: v0.7.7
  • code <number> Код завершения, если дочерний процесс завершился самостоятельно, или null, если дочерний процесс завершился из-за сигнала.
  • signal <string> Сигнал, из-за которого завершился дочерний процесс, или null, если дочерний процесс завершился не из-за сигнала.

Событие 'close' генерируется после завершения процесса и закрытия потоков stdio дочернего процесса. Это событие отличается от события 'exit', поскольку несколько процессов могут совместно использовать одни и те же потоки stdio. Событие 'close' всегда генерируется после того, как уже было сгенерировано событие 'exit', или 'error', если не удалось породить дочерний процесс.

Если процесс завершился, code — это итоговый код завершения процесса, в противном случае — null. Если процесс завершился из-за получения сигнала, signal — это строковое имя сигнала, в противном случае — null. Одно из двух значений всегда будет отличным от null.

CommonJS
const { spawn } = require('node:child_process');
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process close all stdio with code ${code}`);
});

ls.on('exit', (code) => {
  console.log(`child process exited with code ${code}`);
});
Модули JavaScript
import { spawn } from 'node:child_process';
import { once } from 'node:events';
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process close all stdio with code ${code}`);
});

ls.on('exit', (code) => {
  console.log(`child process exited with code ${code}`);
});

const [code] = await once(ls, 'close');
console.log(`child process close all stdio with code ${code}`);

Событие: 'disconnect'

Добавлено в: v0.7.2

Событие 'disconnect' генерируется после вызова метода subprocess.disconnect() в родительском процессе или process.disconnect() в дочернем процессе. После разъединения отправлять и получать сообщения больше нельзя, а свойство subprocess.connected принимает значение false.

Событие: 'error'

  • err <Error> Ошибка.

Событие 'error' генерируется в следующих случаях:

  • Не удалось породить процесс.
  • Не удалось завершить процесс.
  • Не удалось отправить сообщение дочернему процессу.
  • Дочерний процесс был прерван с помощью параметра signal.

Событие 'exit' может как генерироваться, так и не генерироваться после возникновения ошибки. При прослушивании событий 'exit' и 'error' предусмотрите защиту от случайного многократного вызова функций-обработчиков.

См. также subprocess.kill() и subprocess.send().

Событие: 'exit'

Добавлено в: v0.1.90
  • code <number> Код завершения, если дочерний процесс завершился самостоятельно, или null, если дочерний процесс завершился из-за сигнала.
  • signal <string> Сигнал, из-за которого завершился дочерний процесс, или null, если дочерний процесс завершился не из-за сигнала.

Событие 'exit' генерируется после завершения дочернего процесса. Если процесс завершился, code — это итоговый код завершения процесса, в противном случае — null. Если процесс завершился из-за получения сигнала, signal — это строковое имя сигнала, в противном случае — null. Одно из двух значений всегда будет отличным от null.

Когда генерируется событие 'exit', потоки stdio дочернего процесса могут быть всё ещё открыты.

Node.js устанавливает обработчики сигналов для SIGINT и SIGTERM, поэтому процессы Node.js не завершаются сразу после получения этих сигналов. Вместо этого Node.js выполняет последовательность действий по очистке, а затем повторно отправляет обработанный сигнал.

См. waitpid(2).

Если code имеет значение null из-за завершения по сигналу, можно использовать util.convertProcessSignalToExitCode(), чтобы преобразовать сигнал в код завершения POSIX.

Событие: 'message'

Добавлено в: v0.5.9
  • message <Object> Разобранный объект JSON или примитивное значение.
  • sendHandle <Handle> | <undefined> undefined или объект net.Socket, net.Server либо dgram.Socket.

Событие 'message' генерируется, когда дочерний процесс использует process.send() для отправки сообщений.

Сообщение проходит сериализацию и разбор. Полученное сообщение может отличаться от исходно отправленного.

Если при порождении дочернего процесса параметру serialization было задано значение 'advanced', аргумент message может содержать данные, которые невозможно представить в JSON. Подробнее см. в разделе Расширенная сериализация.

Событие: 'spawn'

Добавлено в: v15.1.0, v14.17.0

Событие 'spawn' генерируется после успешного порождения дочернего процесса. Если порождение дочернего процесса завершается неудачей, событие 'spawn' не генерируется, а вместо него генерируется событие 'error'.

Если оно генерируется, событие 'spawn' предшествует всем остальным событиям и получению любых данных через stdout или stderr.

Событие 'spawn' генерируется независимо от того, происходит ли ошибка внутри порождённого процесса. Например, если bash some-command успешно порождён, будет сгенерировано событие 'spawn', даже если порождение bash завершается неудачей для some-command. Это замечание также относится к использованию { shell: true }.

subprocess.channel

История
Версия Изменения
v14.0.0

Объект больше не раскрывает случайно привязки native C++.

v7.1.0

Добавлено в: v7.1.0

  • Тип: <Object> Канал для связи с дочерним процессом через IPC.

Свойство subprocess.channel содержит ссылку на IPC-канал дочернего процесса. Если IPC-канала нет, это свойство имеет значение undefined.

subprocess.channel.ref()
Добавлено в: v7.1.0

Этот метод не позволяет IPC-каналу остановить цикл событий родительского процесса, если ранее был вызван .unref().

subprocess.channel.unref()
Добавлено в: v7.1.0

Этот метод позволяет IPC-каналу не поддерживать работу цикла событий родительского процесса, благодаря чему он может завершиться, даже если канал открыт.

subprocess.connected

Добавлено в: v0.7.2
  • Тип: <boolean> Принимает значение false после вызова subprocess.disconnect().

Свойство subprocess.connected указывает, можно ли ещё отправлять сообщения дочернему процессу и получать их от него. Если subprocess.connected имеет значение false, отправлять и получать сообщения больше нельзя.

subprocess.disconnect()

Добавлено в: v0.7.2

Закрывает IPC-канал между родительским и дочерним процессами, позволяя дочернему процессу корректно завершиться, если нет других соединений, поддерживающих его работу. После вызова этого метода свойства subprocess.connected и process.connected в родительском и дочернем процессах соответственно получат значение false, и передавать сообщения между процессами станет невозможно.

Событие 'disconnect' будет сгенерировано, когда не останется сообщений, ожидающих получения. Обычно оно генерируется сразу после вызова subprocess.disconnect().

Если дочерний процесс является экземпляром Node.js (например, порождён с помощью child_process.fork()), в нём также можно вызвать метод process.disconnect(), чтобы закрыть IPC-канал.

subprocess.exitCode

  • Тип: <integer>

Свойство subprocess.exitCode указывает код завершения дочернего процесса. Если дочерний процесс ещё работает, значение этого поля будет null.

Если дочерний процесс завершён сигналом, subprocess.exitCode будет иметь значение null, а свойству subprocess.signalCode будет присвоено значение. Чтобы получить соответствующий код завершения POSIX, используйте util.convertProcessSignalToExitCode(subprocess.signalCode).

subprocess.kill([signal])

Добавлено в: v0.1.90
  • signal <number> | <string>
  • Возвращает: <boolean>

Метод subprocess.kill() отправляет сигнал дочернему процессу. Если аргумент не указан, процессу будет отправлен сигнал 'SIGTERM'. Список доступных сигналов см. в signal(7). Эта функция возвращает true, если kill(2) завершается успешно, и false в противном случае.

CommonJS
const { spawn } = require('node:child_process');
const grep = spawn('grep', ['ssh']);

grep.on('close', (code, signal) => {
  console.log(
    `child process terminated due to receipt of signal ${signal}`);
});

// Send SIGHUP to process.
grep.kill('SIGHUP');
Модули JavaScript
import { spawn } from 'node:child_process';
const grep = spawn('grep', ['ssh']);

grep.on('close', (code, signal) => {
  console.log(
    `child process terminated due to receipt of signal ${signal}`);
});

// Send SIGHUP to process.
grep.kill('SIGHUP');

Объект ChildProcess может сгенерировать событие 'error', если доставить сигнал не удастся. Отправка сигнала уже завершившемуся дочернему процессу не считается ошибкой, но может привести к непредвиденным последствиям. В частности, если идентификатор процесса (PID) был назначен другому процессу, сигнал будет отправлен этому процессу, что может привести к неожиданным результатам.

Хотя функция вызывается с аргументом kill, отправленный дочернему процессу сигнал может фактически не завершить процесс.

См. справочник kill(2).

В Windows, где сигналов POSIX нет, аргумент signal игнорируется, за исключением значений 'SIGKILL', 'SIGTERM', 'SIGINT' и 'SIGQUIT'; процесс всегда завершается принудительно и немедленно (аналогично 'SIGKILL'). Подробнее см. в разделе События сигналов.

В Linux дочерние процессы дочерних процессов не завершаются при попытке завершить их родительский процесс. Это может произойти при запуске нового процесса в оболочке или с использованием параметра shell метода ChildProcess:

CommonJS
const { spawn } = require('node:child_process');

const subprocess = spawn(
  'sh',
  [
    '-c',
    `node -e "setInterval(() => {
      console.log(process.pid, 'is alive')
    }, 500);"`,
  ], {
    stdio: ['inherit', 'inherit', 'inherit'],
  },
);

setTimeout(() => {
  subprocess.kill(); // Does not terminate the Node.js process in the shell.
}, 2000);
Модули JavaScript
import { spawn } from 'node:child_process';

const subprocess = spawn(
  'sh',
  [
    '-c',
    `node -e "setInterval(() => {
      console.log(process.pid, 'is alive')
    }, 500);"`,
  ], {
    stdio: ['inherit', 'inherit', 'inherit'],
  },
);

setTimeout(() => {
  subprocess.kill(); // Does not terminate the Node.js process in the shell.
}, 2000);

subprocess[Symbol.dispose]()

История
Версия Изменения
v24.2.0

Больше не является экспериментальным.

v20.5.0, v18.18.0

Добавлено в: v20.5.0, v18.18.0

Вызывает subprocess.kill() с аргументом 'SIGTERM'.

subprocess.killed

Добавлено в: v0.5.10
  • Тип: <boolean> Получает значение true после успешной отправки сигнала дочернему процессу с помощью subprocess.kill().

Свойство subprocess.killed указывает, успешно ли дочерний процесс получил сигнал от subprocess.kill(). Свойство killed не указывает на то, что дочерний процесс был завершён.

subprocess.pid

Добавлено в: v0.1.90
  • Тип: <integer> | <undefined>

Возвращает идентификатор процесса (PID) дочернего процесса. Если из-за ошибок не удаётся породить дочерний процесс, значение будет равно undefined и будет сгенерировано событие error.

CommonJS
const { spawn } = require('node:child_process');
const grep = spawn('grep', ['ssh']);

console.log(`Spawned child pid: ${grep.pid}`);
grep.stdin.end();
Модули JavaScript
import { spawn } from 'node:child_process';
const grep = spawn('grep', ['ssh']);

console.log(`Spawned child pid: ${grep.pid}`);
grep.stdin.end();

subprocess.ref()

Добавлено в: v0.7.10

Вызов subprocess.ref() после вызова subprocess.unref() восстанавливает уменьшенный счётчик ссылок дочернего процесса, заставляя родительский процесс дождаться завершения дочернего процесса, прежде чем завершиться самому.

CommonJS
const { spawn } = require('node:child_process');
const process = require('node:process');

const subprocess = spawn(process.argv[0], ['child_program.js'], {
  detached: true,
  stdio: 'ignore',
});

subprocess.unref();
subprocess.ref();
Модули JavaScript
import { spawn } from 'node:child_process';
import process from 'node:process';

const subprocess = spawn(process.argv[0], ['child_program.js'], {
  detached: true,
  stdio: 'ignore',
});

subprocess.unref();
subprocess.ref();

subprocess.send(message[, sendHandle[, options]][, callback])

История
Версия Изменения
v5.8.0

Теперь поддерживается параметр options, в частности параметр keepOpen.

v5.0.0

Теперь этот метод возвращает логическое значение для управления потоком.

v4.0.0

Теперь поддерживается параметр callback.

v0.5.9

Добавлено в: v0.5.9

  • message <Object>
  • sendHandle <Handle> | <undefined> undefined или объект net.Socket, net.Server либо dgram.Socket.
  • options <Object> Аргумент options, если он указан, представляет собой объект, задающий параметры отправки определённых типов дескрипторов. options поддерживает следующие свойства:
    • keepOpen <boolean> Значение, используемое при передаче экземпляров net.Socket. Если значение равно true, сокет остаётся открытым в отправляющем процессе. По умолчанию: false.
  • callback <Function>
  • Возвращает: <boolean>

Если между родительским и дочерним процессами установлен IPC-канал (например, при использовании child_process.fork()), метод subprocess.send() можно использовать для отправки сообщений дочернему процессу. Если дочерний процесс является экземпляром Node.js, такие сообщения можно получать через событие 'message'.

Сообщение проходит сериализацию и разбор. Полученное сообщение может отличаться от исходно отправленного.

Например, родительский скрипт может выглядеть так:

CommonJS
const { fork } = require('node:child_process');
const forkedProcess = fork(`${__dirname}/sub.js`);

forkedProcess.on('message', (message) => {
  console.log('PARENT got message:', message);
});

// Causes the child to print: CHILD got message: { hello: 'world' }
forkedProcess.send({ hello: 'world' });
Модули JavaScript
import { fork } from 'node:child_process';
const forkedProcess = fork(`${import.meta.dirname}/sub.js`);

forkedProcess.on('message', (message) => {
  console.log('PARENT got message:', message);
});

// Causes the child to print: CHILD got message: { hello: 'world' }
forkedProcess.send({ hello: 'world' });

Тогда дочерний скрипт 'sub.js' может выглядеть следующим образом:

process.on('message', (message) => {
  console.log('CHILD got message:', message);
});

// Causes the parent to print: PARENT got message: { foo: 'bar', baz: null }
process.send({ foo: 'bar', baz: NaN }); copy

Дочерние процессы Node.js имеют собственный метод process.send(), позволяющий дочернему процессу отправлять сообщения обратно родительскому.

Особый случай — отправка сообщения {cmd: 'NODE_foo'}. Сообщения, свойство cmd которых содержит префикс NODE_, зарезервированы для внутреннего использования ядром Node.js и не будут генерироваться в событии 'message' дочернего процесса. Вместо этого такие сообщения генерируются через событие 'internalMessage' и обрабатываются Node.js внутри. Приложениям следует избегать использования таких сообщений и прослушивания событий 'internalMessage', поскольку это поведение может измениться без предупреждения.

Необязательный аргумент sendHandle, который можно передать в subprocess.send(), предназначен для передачи дочернему процессу сервера TCP или объекта сокета. Дочерний процесс получит этот объект в качестве второго аргумента функции обратного вызова, зарегистрированной для события 'message'. Данные, полученные и буферизованные сокетом, дочернему процессу отправлены не будут. Отправка IPC-сокетов в Windows не поддерживается.

Необязательный параметр callback — это функция, которая вызывается после отправки сообщения, но до того, как дочерний процесс мог его получить. Функция вызывается с одним аргументом: null в случае успеха или объектом Error в случае ошибки.

Если функция callback не задана и сообщение не удаётся отправить, объект ChildProcess сгенерирует событие 'error'. Такое может произойти, например, если дочерний процесс уже завершился.

subprocess.send() вернёт false, если канал закрыт или очередь неотправленных сообщений превысила пороговое значение, после которого отправлять новые сообщения нецелесообразно. В противном случае метод возвращает true. Функцию callback можно использовать для реализации управления потоком.

Пример: отправка объекта сервера

Аргумент sendHandle можно использовать, например, для передачи дочернему процессу дескриптора объекта TCP-сервера, как показано в примере ниже:

CommonJS
const { fork } = require('node:child_process');
const { createServer } = require('node:net');

const subprocess = fork('subprocess.js');

// Open up the server object and send the handle.
const server = createServer();
server.on('connection', (socket) => {
  socket.end('handled by parent');
});
server.listen(1337, () => {
  subprocess.send('server', server);
});
Модули JavaScript
import { fork } from 'node:child_process';
import { createServer } from 'node:net';

const subprocess = fork('subprocess.js');

// Open up the server object and send the handle.
const server = createServer();
server.on('connection', (socket) => {
  socket.end('handled by parent');
});
server.listen(1337, () => {
  subprocess.send('server', server);
});

Затем дочерний процесс получит объект сервера следующим образом:

process.on('message', (m, server) => {
  if (m === 'server') {
    server.on('connection', (socket) => {
      socket.end('handled by child');
    });
  }
}); copy

После того как сервер становится общим для родительского и дочернего процессов, часть соединений может обрабатывать родительский процесс, а часть — дочерний.

В приведённом выше примере используется сервер, созданный с помощью модуля node:net, однако серверы модуля node:dgram работают точно так же, за исключением того, что вместо события 'connection' они прослушивают событие 'message', а вместо server.listen() используют server.bind(). Однако это поддерживается только на платформах Unix.

Пример: отправка объекта сокета

Аналогично, аргумент sendHandler можно использовать для передачи дочернему процессу дескриптора сокета. В приведённом ниже примере порождаются два дочерних процесса, каждый из которых обрабатывает соединения с «обычным» или «высоким» приоритетом:

CommonJS
const { fork } = require('node:child_process');
const { createServer } = require('node:net');

const normal = fork('subprocess.js', ['normal']);
const special = fork('subprocess.js', ['special']);

// Open up the server and send sockets to child. Use pauseOnConnect to prevent
// the sockets from being read before they are sent to the child process.
const server = createServer({ pauseOnConnect: true });
server.on('connection', (socket) => {

  // If this is special priority...
  if (socket.remoteAddress === '74.125.127.100') {
    special.send('socket', socket);
    return;
  }
  // This is normal priority.
  normal.send('socket', socket);
});
server.listen(1337);
Модули JavaScript
import { fork } from 'node:child_process';
import { createServer } from 'node:net';

const normal = fork('subprocess.js', ['normal']);
const special = fork('subprocess.js', ['special']);

// Open up the server and send sockets to child. Use pauseOnConnect to prevent
// the sockets from being read before they are sent to the child process.
const server = createServer({ pauseOnConnect: true });
server.on('connection', (socket) => {

  // If this is special priority...
  if (socket.remoteAddress === '74.125.127.100') {
    special.send('socket', socket);
    return;
  }
  // This is normal priority.
  normal.send('socket', socket);
});
server.listen(1337);

subprocess.js получит дескриптор сокета в качестве второго аргумента функции обратного вызова события:

process.on('message', (m, socket) => {
  if (m === 'socket') {
    if (socket) {
      // Check that the client socket exists.
      // It is possible for the socket to be closed between the time it is
      // sent and the time it is received in the child process.
      socket.end(`Request handled with ${process.argv[2]} priority`);
    }
  }
}); copy

Не используйте .maxConnections для сокета, переданного дочернему процессу. Родительский процесс не может отследить, когда сокет будет уничтожен.

Обработчики 'message' в дочернем процессе должны проверять наличие socket, поскольку соединение может быть закрыто за время, необходимое для его передачи дочернему процессу.

subprocess.signalCode

  • Тип: <string> | <null>

Свойство subprocess.signalCode указывает сигнал, полученный дочерним процессом, если он был, или null в противном случае.

Если дочерний процесс завершён сигналом, subprocess.exitCode будет иметь значение null. Чтобы получить соответствующий код завершения POSIX, используйте util.convertProcessSignalToExitCode(subprocess.signalCode).

subprocess.spawnargs

  • Тип: <Array>

Свойство subprocess.spawnargs содержит полный список аргументов командной строки, с которыми был запущен дочерний процесс.

subprocess.spawnfile

  • Тип: <string>

Свойство subprocess.spawnfile указывает имя исполняемого файла запускаемого дочернего процесса.

Для child_process.fork() его значение будет равно process.execPath. Для child_process.spawn() его значением будет имя исполняемого файла. Для child_process.exec() его значением будет имя оболочки, в которой запускается дочерний процесс.

subprocess.stderr

Добавлено в: v0.1.90
  • Тип: <stream.Readable> | <null> | <undefined>

Readable Stream, представляющий stderr дочернего процесса.

Если при порождении дочернего процесса для stdio[2] задано любое значение, кроме 'pipe', то это свойство будет равно null.

subprocess.stderr — это псевдоним subprocess.stdio[2]. Оба свойства ссылаются на одно и то же значение.

Если не удалось успешно породить дочерний процесс, свойство subprocess.stderr может иметь значение null или undefined.

subprocess.stdin

Добавлено в: v0.1.90
  • Тип: <stream.Writable> | <null> | <undefined>

Writable Stream, представляющий stdin дочернего процесса.

Если дочерний процесс ожидает чтения всего входного потока, он не продолжит работу, пока этот поток не будет закрыт с помощью end().

Если при порождении дочернего процесса для stdio[0] задано любое значение, кроме 'pipe', то это свойство будет равно null.

subprocess.stdin — это псевдоним subprocess.stdio[0]. Оба свойства ссылаются на одно и то же значение.

Если не удалось успешно породить дочерний процесс, свойство subprocess.stdin может иметь значение null или undefined.

subprocess.stdio

Добавлено в: v0.7.10
  • Тип: <Array>

Разреженный массив каналов связи с дочерним процессом, соответствующих позициям параметра stdio, переданного в child_process.spawn(), которым присвоено значение 'pipe'. subprocess.stdio[0], subprocess.stdio[1] и subprocess.stdio[2] также доступны как subprocess.stdin, subprocess.stdout и subprocess.stderr соответственно.

В следующем примере только fd 1 (stdout) дочернего процесса настроен как канал связи, поэтому потоком является только subprocess.stdio[1] родительского процесса, а все остальные значения в массиве равны null.

CommonJS
const assert = require('node:assert');
const fs = require('node:fs');
const child_process = require('node:child_process');

const subprocess = child_process.spawn('ls', {
  stdio: [
    0, // Use parent's stdin for child.
    'pipe', // Pipe child's stdout to parent.
    fs.openSync('err.out', 'w'), // Direct child's stderr to a file.
  ],
});

assert.strictEqual(subprocess.stdio[0], null);
assert.strictEqual(subprocess.stdio[0], subprocess.stdin);

assert(subprocess.stdout);
assert.strictEqual(subprocess.stdio[1], subprocess.stdout);

assert.strictEqual(subprocess.stdio[2], null);
assert.strictEqual(subprocess.stdio[2], subprocess.stderr);
Модули JavaScript
import assert from 'node:assert';
import fs from 'node:fs';
import child_process from 'node:child_process';

const subprocess = child_process.spawn('ls', {
  stdio: [
    0, // Use parent's stdin for child.
    'pipe', // Pipe child's stdout to parent.
    fs.openSync('err.out', 'w'), // Direct child's stderr to a file.
  ],
});

assert.strictEqual(subprocess.stdio[0], null);
assert.strictEqual(subprocess.stdio[0], subprocess.stdin);

assert(subprocess.stdout);
assert.strictEqual(subprocess.stdio[1], subprocess.stdout);

assert.strictEqual(subprocess.stdio[2], null);
assert.strictEqual(subprocess.stdio[2], subprocess.stderr);

Если не удалось успешно породить дочерний процесс, свойство subprocess.stdio может иметь значение undefined.

subprocess.stdout

Добавлено в: v0.1.90
  • Тип: <stream.Readable> | <null> | <undefined>

Объект Readable Stream, представляющий stdout дочернего процесса.

Если дочерний процесс был запущен с параметром stdio[1], установленным в любое значение, отличное от 'pipe', то это значение будет null.

subprocess.stdout — это псевдоним для subprocess.stdio[1]. Оба свойства будут ссылаться на одно и то же значение.

CommonJS
const { spawn } = require('node:child_process');

const subprocess = spawn('ls');

subprocess.stdout.on('data', (data) => {
  console.log(`Received chunk ${data}`);
});
Модули JavaScript
import { spawn } from 'node:child_process';

const subprocess = spawn('ls');

subprocess.stdout.on('data', (data) => {
  console.log(`Received chunk ${data}`);
});

Свойство subprocess.stdout может иметь значение null или undefined, если дочерний процесс не удалось успешно запустить.

subprocess.unref()

Добавлено в: v0.7.10

По умолчанию родительский процесс будет ожидать завершения отсоединённого дочернего процесса. Чтобы предотвратить ожидание родительским процессом завершения заданного subprocess, используйте метод subprocess.unref(). Это приведёт к тому, что дочерний процесс не будет учитываться в счётчике ссылок цикла событий родительского процесса, позволяя родительскому процессу завершиться независимо от дочернего, если между дочерним и родительским процессами не установлен канал IPC.

CommonJS
const { spawn } = require('node:child_process');
const process = require('node:process');

const subprocess = spawn(process.argv[0], ['child_program.js'], {
  detached: true,
  stdio: 'ignore',
});

subprocess.unref();
Модули JavaScript
import { spawn } from 'node:child_process';
import process from 'node:process';

const subprocess = spawn(process.argv[0], ['child_program.js'], {
  detached: true,
  stdio: 'ignore',
});

subprocess.unref();

maxBuffer и Unicode

Параметр maxBuffer задаёт максимальное количество байтов, допустимое для stdout или stderr. При превышении этого значения дочерний процесс завершается. Это влияет на вывод, содержащий многобайтовые кодировки символов, например UTF-8 или UTF-16. Например, console.log('中文测试') отправит 13 байтов в кодировке UTF-8 в stdout, хотя в нём всего 4 символа.

Требования к оболочке

Оболочка должна поддерживать переключатель -c. Если оболочка является 'cmd.exe', она должна поддерживать переключатели /d /s /c, а разбор командной строки должен быть совместимым.

Оболочка Windows по умолчанию

Хотя Microsoft указывает, что %COMSPEC% должна содержать путь к 'cmd.exe' в корневом окружении, к дочерним процессам это требование применяется не всегда. Поэтому в функциях child_process, в которых можно запустить оболочку, в качестве запасного варианта используется 'cmd.exe', если process.env.ComSpec недоступна.

Расширенная сериализация

Добавлено в: v13.2.0, v12.16.0

Дочерние процессы поддерживают механизм сериализации для IPC, основанный на API сериализации модуля node:v8 и алгоритме структурированного клонирования HTML. Этот механизм, как правило, обладает большими возможностями и поддерживает больше встроенных типов объектов JavaScript, таких как BigInt, Map и Set, ArrayBuffer и TypedArray, Buffer, Error, RegExp и т. д.

Однако этот формат не является полным надмножеством JSON. Например, свойства, заданные для объектов таких встроенных типов, не будут переданы на этапе сериализации. Кроме того, производительность может отличаться от производительности JSON в зависимости от структуры передаваемых данных. Поэтому для использования этой возможности необходимо явно задать параметр serialization в значение 'advanced' при вызове child_process.spawn() или child_process.fork().

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v24.x/docs/api/child_process.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API