Node.js
Выполнение файлов или команд с помощью дочерних процессов
Поиск…
Синтаксис
- 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);