Как с помощью child_process { exec, spawn } запускать и останавливать приложение через команды npm?

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

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

const { exec } = require('child_process');

exec('npm start', (error, stdout, stderr) => {
  if (error) {
    console.error(`Ошибка выполнения команды: ${error.message}`);
    return;
  }
  if (stderr) {
    console.error(`Ошибка при запуске приложения: ${stderr}`);
    return;
  }
  console.log(`Приложение успешно запущено:n${stdout}`);
});

Метод spawn, в отличие от exec, создает новый процесс и устанавливает каналы связи для ввода/вывода/ошибок. Это позволяет нам получать данные из вывода команды в реальном времени. Например, чтобы запустить приложение с помощью команды npm, и получить его вывод в реальном времени, вы можете использовать следующий код:

const { spawn } = require('child_process');

const child = spawn('npm', ['start']);

child.stdout.on('data', (data) => {
  console.log(`Вывод приложения: ${data}`);
});

child.stderr.on('data', (data) => {
  console.error(`Ошибка при запуске приложения: ${data}`);
});

child.on('error', (error) => {
  console.error(`Ошибка выполнения команды: ${error.message}`);
});

child.on('close', (code) => {
  console.log(`Приложение завершило работу с кодом ${code}`);
});

В этом примере мы создаем новый процесс, передавая команду "npm" и аргумент "start" в функцию spawn. Затем мы прослушиваем события stdout, stderr и error, чтобы обработать вывод приложения и ошибки, связанные с его выполнением. Наконец, мы прослушиваем событие close для обработки завершения работы приложения и получения его кода завершения.

При остановке приложения с помощью команды npm вы можете использовать метод kill(), чтобы отправить сигнал остановки:

const { exec } = require('child_process');

exec('npm run stop', (error, stdout, stderr) => {
  if (error) {
    console.error(`Ошибка выполнения команды: ${error.message}`);
    return;
  }
  if (stderr) {
    console.error(`Ошибка при остановке приложения: ${stderr}`);
    return;
  }
  console.log(`Приложение успешно остановлено:n${stdout}`);
});

Обратите внимание, что в команде использовано "npm run stop", чтобы выполнить скрипт с именем "stop" из файла package.json вашего приложения.