DevGang
Авторизоваться

Реализация бинарных файлов в командной строке с помощью Node.js: Подробное руководство

Исполняемые файлы, которые можно запустить через командную строку, известны как бинарные программы командной строки. Мы можем создать сценарий Node.js для запуска таких программ из командной строки и потенциально обрабатывать их ввод и вывод. Прежде чем мы узнаем, как выполнить бинарный файл командной строки в Node, давайте сначала разберемся, что он означает.

Что такое бинарная командная строка?

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

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

Примеры бинарных файлов командной строки

  • Исполняемые двоичные файлы в Windows обычно распознаются по расширению файла, которое часто бывает типа .exe. Например, файл с именем notepad.exe является исполняемым двоичным файлом.
  • В Unix-подобных системах, таких как Linux и macOS, исполняемые двоичные файлы могут иметь пользовательское расширение или вообще не иметь расширения. Примерами могут служить ls и grep.

Список некоторых двоичных файлов для командной строки Windows:

Список некоторых двоичных файлов для командной строки Linux:

Зачем запускать бинарные файлы командной строки в Node.js?

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

Способы выполнения двоичных файлов командной строки в Node.js

Теперь давайте рассмотрим лучшие способы выполнения двоичных файлов командной строки с помощью Node.js.

1. child_process.exec()

Node.js - это однопоточный процесс, однако с помощью модуля child_process можно создать несколько потоков одновременно.

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

exec() - это метод запуска двоичной команды в командной строке в Node.js. Мы можем импортировать функцию exec() из модуля child_process. Функция обратного вызова этого метода имеет три параметра:

  • error: Если команда столкнется с ошибкой, она будет зарегистрирована в консоли как ошибка.
  • stdout: Данные в стандартном потоке вывода записываются в консоль.
  • stderr: Если в стандартном потоке ошибок есть какие-либо данные, они будут записаны в консоль как ошибка.

Давайте рассмотрим пример выполнения двоичного файла командной строки с помощью функции exec().

Пример:

const { exec } = require('child_process');
 
const command = 'dir /B /O:N';
 
exec(command, (error, stdout, stderr) => {
  if (error) {
    console.error(`Error: ${error.message}`);
    return;
  }
  if (stderr) {
    console.error(`stderr: ${stderr}`);
    return;
  }
  console.log(`stdout: ${stdout}`);//Call back function end
});

Здесь:

  • Командная строка имеет значение 'dir /B /O:N'.
  • dir - это бинарный файл, который мы хотим выполнить. Эта команда похожа на команду Unix "ls" и используется для перечисления файлов и каталогов.
  • /B - аргумент, передаваемый dir для отображения только имен файлов.
  • /O: N - аргумент, передаваемый dir для сортировки файлов по имени.

Выходные данные:

Здесь:

  • Файлы "exec.js", "index.html" и "style.css" находятся в данной директории.

Примечание:

Обратите внимание, что в представленном коде используется команда dir /B /O: N, характерная для командной строки Windows. Если вы используете другую операционную систему, например Linux или macOS, вам может потребоваться соответствующая модификация команды. В системах на базе Unix обычно используется команда ls.

Дополнительные подробности:

Функция exec() работает с буфером и по умолчанию имеет объем буфера 200k. Однако она не предназначена для процессов, возвращающих в Node большие буферы. Если child_process возвращает что-то большее, чем 200k, он выдаст сообщение об ошибке "memory buffer exceeded".

Использование функции util.promisify()

Промисы в Node.js позволяют создавать чистый, структурированный и асинхронный код. В Node.js вы можете использовать функцию util.promisify, чтобы преобразовать способ взаимодействия с функциями типа child_process из системы, основанной на обратных вызовах, в систему, основанную на обещаниях. Это может облегчить чтение кода и управление им. Вы можете использовать методы .then() и .catch(), чтобы обрабатывать результаты дочерних процессов более простым способом.

Пример:

onst util = require('util');
const { exec } = require('child_process');
 
const promisifiedExec = util.promisify(exec);
 
async function listFiles() {
  const command = 'dir /B /O:N';
 
  try {
    const { stdout, stderr } = await promisifiedExec(command);
     
    if (stderr) {
      console.error(`stderr: ${stderr}`);
      return;
    }
     
    console.log(`stdout: ${stdout}`);
  } catch (error) {
    console.error(`Error: ${error.message}`);
  }
}
 
listFiles();

Здесь:

  • Команда dir /B /O:N предоставляет список файлов и каталогов в указанном месте.
  • Функция execPromise создается с помощью promisify, чтобы преобразовать функцию exec, основанную на обратном вызове, в функцию, основанную на промисе.
  • Функция executeCommand запускает двоичный файл dir с помощью execPromise и ожидает его ответа.
  • Стандартный вывод программы и сообщения об ошибках выводятся на консоль.

Выходные данные:

Информация о каталоге выводится в консоль.

2. child_process.spawn()

Функция spawn() позволяет выполнить двоичный файл командной строки в новом процессе. Эта функция использует потоковый API, что означает, что ее вывод доступен через слушателей. Результат не будет храниться в памяти, но он может быть доступен через слушателей потока, которые мы создаем в нашем коде.

Давайте рассмотрим пример выполнения двоичного файла командной строки с помощью spawn().

Пример:

const { spawn } = require('child_process');
 
const echoCommand = 'echo.exe';
const echoArguments = ['Hello and Welcome to CodeforGeeks'];
 
const echoProcess = spawn(echoCommand, echoArguments);
 
echoProcess.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});
 
echoProcess.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});
 
echoProcess.on('close', (code) => {
  console.log(`Child process exited with code ${code}`);
});

Здесь:

  • echoCommand имеет значение echo.exe, которое является исполняемым файлом для команды echo в Windows.
  • ['Hello and Welcome to CodeforGeeks'] - это аргументы, передаваемые команде echo.
  • Событие close используется для получения кода завершения дочернего процесса. Этот код может быть полезен для определения успеха или неудачи выполненной команды.
  • Функция spawn возвращает объект ChildProcess, который является экземпляром класса EventEmitter. Это позволяет вам прослушивать различные события, такие как data, error и close, как показано в примере.

Выходные данные:

После выполнения команды в качестве выходных данных будет отображен введенный текст.

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

Заключение

Исполняемые файлы командной строки обеспечивают широкий набор функций, от базовых файловых операций, таких как копирование, перемещение и удаление файлов, до продвинутых инструментов, таких как компиляторы (gcc), базы данных (mysql) и веб-серверы (nginx). Жизненно важные двоичные файлы упрощают выполнение задач и повышают эффективность системного администрирования. CLI позволяет выполнять сложные рабочие процессы для конкретных вычислительных задач.

В этой статье мы рассмотрели два метода модуля child_process для выполнения двоичных файлов командной строки: child_process.exec() и child_process.spawn(). Надеюсь, вам понравилось читать этот материал!

Источник:

#JavaScript #NodeJS
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться