← Назад к вопросам

Как создать новый процесс в Js?

1.3 Junior🔥 251 комментариев
#JavaScript Core#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как создать новый процесс в JS?

В JavaScript создание процессов возможно только в Node.js, так как в браузере нет доступа к операционной системе. Node.js предоставляет модуль child_process для создания дочерних процессов.

Методы создания процессов

1. spawn() — потоковое выполнение

Для выполнения больших объёмов данных с использованием потоков:

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

const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`Output: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`Error: ${data}`);
});

ls.on('close', (code) => {
  console.log(`Process exited with code ${code}`);
});

Плюсы:

  • Потоковая обработка
  • Низкое использование памяти
  • Для больших данных

Минусы:

  • Обработка потоков усложнена

2. exec() — простое выполнение команд

Для простых команд оболочки:

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

exec('ls -la', (error, stdout, stderr) => {
  if (error) {
    console.error(`Error: ${error.message}`);
    return;
  }
  if (stderr) {
    console.error(`stderr: ${stderr}`);
    return;
  }
  console.log(`Output: ${stdout}`);
});

Плюсы:

  • Простой синтаксис
  • Вся информация в одном месте

Минусы:

  • Весь вывод в памяти
  • Не подходит для больших данных

3. execFile() — выполнение файла

Для выполнения конкретного файла без оболочки:

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

execFile('node', ['script.js'], (error, stdout, stderr) => {
  if (error) throw error;
  console.log(stdout);
});

4. fork() — создание Node.js процесса

Для создания нового Node.js процесса с IPC каналом:

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

const child = fork('child.js');

// Отправка сообщения дочернему процессу
child.send({ hello: 'world' });

// Получение сообщения от дочернего процесса
child.on('message', (msg) => {
  console.log('Message from child:', msg);
});

// Обработка завершения
child.on('close', (code) => {
  console.log('Child exited with code', code);
});

child.js:

// Получение сообщения от родителя
process.on('message', (msg) => {
  console.log('Message from parent:', msg);
  
  // Отправка сообщения обратно
  process.send({ hello: 'parent' });
});

Promisify для async/await

const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);

async function runCommand() {
  try {
    const { stdout, stderr } = await execPromise('ls -la');
    console.log('Output:', stdout);
  } catch (error) {
    console.error('Error:', error);
  }
}

runCommand();

Выполнение скриптов

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

// Выполнение Python скрипта
exec('python script.py', (error, stdout, stderr) => {
  if (error) {
    console.error('Error:', error);
    return;
  }
  console.log('Output:', stdout);
});

// Выполнение bash команды
exec('echo "Hello from bash"', (error, stdout) => {
  console.log(stdout);
});

Обработка ошибок

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

const child = spawn('nonexistent-command');

child.on('error', (error) => {
  console.error('Failed to start child process:', error);
});

child.on('close', (code) => {
  if (code !== 0) {
    console.log('Process exited with error code:', code);
  }
});

Таблица сравнения

МетодИспользованиеПамятьСкорость
spawn()Большие объёмы данныхНизкоеБыстро
exec()Простые командыВысокоеНормально
execFile()Файлы без оболочкиСреднееБыстро
fork()Мультипроцессинг Node.jsСреднееЗависит

Best Practices

  • Используй spawn() для больших данных
  • Используй exec() для простых команд
  • Используй fork() для распределённых вычислений
  • Всегда обрабатывай ошибки
  • Очищай процессы при завершении
  • Избегай shell injection — передавай аргументы массивом

Безопасность

// ❌ Опасно — возможен shell injection
exec(`ls ${userInput}`);

// ✅ Безопасно
spawn('ls', [userInput]);

Заключение

Для создания процессов в Node.js используй child_process. Выбирай метод в зависимости от задачи: spawn() для потоков, exec() для простых команд, fork() для IPC. Всегда обрабатывай ошибки и очищай ресурсы.

Как создать новый процесс в Js? | PrepBro