Поиск…


Синтаксис

  • child_process.exec (команда [, options] [, обратный вызов])
  • child_process.execFile (файл [, args] [, options] [, callback])
  • child_process.fork (modulePath [, args] [, options])
  • child_process.spawn (команда [, args] [, options])
  • child_process.execFileSync (файл [, args] [, options])
  • child_process.execSync (команда [, options])
  • child_process.spawnSync (команда [, args] [, options])

замечания

При работе с дочерними процессами все асинхронные методы возвращают экземпляр ChildProcess , в то время как все синхронные версии возвращают вывод того, что было запущено. Как и другие синхронные операции в Node.js, если возникает ошибка, она будет бросать.

Создание нового процесса для выполнения команды

Чтобы создать новый процесс, в котором вам нужен небуферизованный вывод (например, длительные процессы, которые могут печатать выходные данные в течение определенного периода времени, а не сразу печатать и child_process.spawn() ), используйте child_process.spawn() .

Этот метод генерирует новый процесс, используя заданную команду и массив аргументов. Возвращаемое значение представляет собой экземпляр ChildProcess , который, в свою очередь, предоставляет свойства stdout и stderr . Оба эти потока являются экземплярами stream.Readable .

Следующий код эквивалентен использованию команды ls -lh /usr .

const spawn = require('child_process').spawn;
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(`child process exited with code ${code}`);
});

Другая команда примера:

zip -0vr "archive" ./image.png

Может быть написано как:

spawn('zip', ['-0vr', '"archive"', './image.png']);

Истечение оболочки для выполнения команды

Чтобы запустить команду в оболочке, в которой требуется буферизованный вывод (т. child_process.exec Это не поток), используйте child_process.exec . Например, если вы хотите запустить команду cat *.js file | wc -l , без параметров, это будет выглядеть так:

const exec = require('child_process').exec;
exec('cat *.js file | wc -l', (err, stdout, stderr) => {
  if (err) {
    console.error(`exec error: ${err}`);
    return;
  }

  console.log(`stdout: ${stdout}`);
  console.log(`stderr: ${stderr}`);
});

Функция принимает до трех параметров:

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

Параметр команды является строкой и требуется, в то время как объект опций и обратный вызов являются необязательными. Если объект options не указан, exec будет использовать следующее по умолчанию:

{
  encoding: 'utf8',
  timeout: 0,
  maxBuffer: 200*1024,
  killSignal: 'SIGTERM',
  cwd: null,
  env: null
}

Объект options также поддерживает параметр shell по умолчанию /bin/sh в UNIX и cmd.exe в Windows, параметр uid для установки идентификатора пользователя процесса и параметр gid для идентификатора группы.

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

Аргументы stdout и stderr являются результатом команды. Он декодируется с кодировкой, указанной в объекте options (по умолчанию: string ), но в противном случае может быть возвращен как объект Buffer .

Существует также синхронная версия exec , которая является execSync . Синхронная версия не выполняет обратный вызов и возвращает stdout вместо экземпляра ChildProcess . Если синхронная версия обнаруживает ошибку, он будет бросать и остановить вашу программу. Это выглядит так:

const execSync = require('child_process').execSync;
const stdout = execSync('cat *.js file | wc -l');
console.log(`stdout: ${stdout}`);

Инициирование процесса запуска исполняемого файла

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

const execFile = require('child_process').execFile;
const child = execFile('node', ['--version'], (err, stdout, stderr) => {
  if (err) {
    throw err;
  }

  console.log(stdout);
});

В отличие от child_process.exec , эта функция будет принимать до четырех параметров, где второй параметр представляет собой массив аргументов, которые вы хотите предоставить исполняемому файлу:

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

В противном случае параметры и формат обратного вызова в противном случае идентичны child_process.exec . То же самое касается синхронной версии функции:

const execFileSync = require('child_process').execFileSync;
const stdout = execFileSync('node', ['--version']);
console.log(stdout);


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow