Node.js выполнить системную команду

Node.js внешний интерфейс Командная строка

Первоначально опубликовано в моем блогеNode.js выполняет системные команды | эфирное пространство

   Когда мы используем Node.js, нам всегда нужно выполнять какие-то системные команды, взаимодействовать с системой или вызывать другие языки, что нам делать в это время?   , конечно, используетchild_processМодуль переводится как подпроцесс.Конечно, как следует из названия, этот модуль в основном функционирует, генерируя подпроцессы.Давайте рассмотрим это на примере.

один,execа такжеexecSync

Этоchild_processСамая простая функция в модуле — выполнение фиксированной системной команды.

const { exec } = require('child_process');
// 输出当前目录(不一定是代码所在的目录)下的文件和文件夹
exec('ls -l', (err, stdout, stderr) => {
    if(err) {
        console.log(err);
        return;
    }
    console.log(`stdout: ${stdout}`);
    console.log(`stderr: ${stderr}`);
})

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

const { exec } = require('child_process');
const path = require('path'):
// 在当前目录下的scripts文件夹里执行hexo g命令
exec('hexo g', { cwd: path.join(process.cwd(), 'scripts') }, (err, stdout, stderr) => {
    if(err) {
        console.log(err);
        return;
    }
    console.log(`stdout: ${stdout}`);
});

  execSyncдаexecсинхронная версия , но либоexecSyncещеexec, полученные результаты представляют собой все строки или объекты Buffer, которые обычно требуют дальнейшей обработки.

Пожалуйста, обратитесь к:execКонкретная конфигурация,execSyncКонкретная конфигурация

два,execFileа такжеexecFileSync

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

const { execFile, execFileSync } = require('child_process');

execFile('example.py', [], (err, stdout, stderr) => {
    if(err) {
        console.log(err);
        return;
    }
    console.log(`stdout: ${stdout}`);
});

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

а такжеexecТочно так же первый параметр — это путь к файлу, который нужно выполнить, второй — массив параметров, третий — конфигурация, а четвертый — функция обратного вызова, конечно, за исключением того, что первый можно опустить.

Примечание. Исполняемый файл должен иметь права на выполнение, если он аналогичен.pyСценарий класса для конкретного языка должен указывать путь к программе интерпретатора в начале.

Пожалуйста, обратитесь к:execFileConfiguration,конфигурация execFileSync

три,spawnа такжеspawnSync

  child_processВсе функции модуля основаны наspawnа такжеspawnSyncреализовать функцию, другими словами,spawnа такжеspawnSyncКонфигурация функции является наиболее полной, а остальные функции инкапсулированы и изменены. Давайте сосредоточимся на:   spawnПрототип функции выглядит так:child_process.spawn(command[, args][, options])

   Создает новый процесс с указанными аргументами командной строки, spawn возвращает объект с потоками stdout и stderr. Вы можете прочитать данные, возвращенные дочерним процессом в Node.js, через поток stdout. stdout владеет'data','end'И события, которые есть в общем потоке. Если вы хотите, чтобы дочерний процесс возвращал Node много данных, таких как обработка изображений, чтение двоичных данных и т. д., вам лучше использовать метод spawn.

const {spawn}  = require('child_process');
const fs = require('fs');
const spawnObj = spawn('ping', ['127.0.0.1'], {encoding: 'utf-8'});
spawnObj.stdout.on('data', function(chunk) {
    console.log(chunk.toString());
});
spawnObj.stderr.on('data', (data) => {
  console.log(data);
});
spawnObj.on('close', function(code) {
    console.log('close code : ' + code);
})
spawnObj.on('exit', (code) => {
    console.log('exit code : ' + code);
    fs.close(fd, function(err) {
        if(err) {
            console.error(err);
        }
    });
});