Skip to main content

Що робить модуль child_process?

Що таке child_process

child_process - це вбудований модуль Node.js, який дозволяє створювати дочірні процеси (child processes) із поточного Node.js-застосунку.

Простіше кажучи:

Він дає можливість запускати інші програми, скрипти чи команди ОС

  • так, ніби ти вводив їх у терміналі.

1. Навіщо потрібен child_process

Він дозволяє:

  • виконувати системні команди (ls, ping, git, python, ffmpeg тощо);
  • запускати інші Node.js-скрипти як окремі процеси;
  • паралельно виконувати обчислення;
  • пов'язувати різні мови й інструменти (наприклад, Node.js ↔ Python);
  • створювати CLI-утиліти й пайплайни (у стилі UNIX).

2. Основні методи модуля child_process

МетодПовертаєОпис
exec()об'єкт процесу (ChildProcess)Запускає команду в оболонці й буферизує результат
execFile()об'єкт процесуЗапускає виконуваний файл напряму (без оболонки)
spawn()об'єкт процесуСтворює потоковий процес - зручно для великих даних
fork()об'єкт процесуЗапускає новий процес Node.js (із вбудованим каналом IPC)

3. Приклади кожного методу

1) exec() - запуск команди й отримання результату

javascript
const { exec } = require('child_process'); exec('ls -la', (error, stdout, stderr) => { if (error) console.error(`Помилка: ${error.message}`); if (stderr) console.error(`STDERR: ${stderr}`); console.log(`Результат:\n${stdout}`); });

Підходить для:

  • простих команд;
  • отримання готового результату у вигляді тексту;
  • невеликого обсягу виводу.

Але! exec() буферизує весь вивід у пам'яті, тому для великих даних краще використовувати spawn().

2) spawn() - потоковий запуск процесу

javascript
const { spawn } = require('child_process'); const child = spawn('ping', ['google.com']); child.stdout.on('data', (data) => { console.log(`Вивід: ${data}`); }); child.stderr.on('data', (data) => { console.error(`Помилка: ${data}`); }); child.on('close', (code) => { console.log(`Процес завершився з кодом ${code}`); });

Підходить для:

  • тривалих процесів (наприклад, ffmpeg, npm run, curl);
  • обробки даних у реальному часі (через stdout, stderr).

3) execFile() - запуск конкретного файлу

javascript
const { execFile } = require('child_process'); execFile('node', ['-v'], (error, stdout) => { if (error) throw error; console.log(`Версія Node.js: ${stdout}`); });

Різниця з exec():

  • не використовує оболонку (bash, cmd);
  • швидше й безпечніше (менше ризику інʼєкцій команд);
  • ідеально підходить для виклику виконуваних файлів чи скриптів.

4) fork() - запуск нового процесу Node.js

javascript
const { fork } = require('child_process'); const child = fork('worker.js'); child.on('message', (msg) => console.log('Відповідь від воркера:', msg)); child.send({ task: 'compute', value: 5 });

worker.js

javascript
process.on('message', (msg) => { const result = msg.value * 2; process.send({ result }); });

Особливості fork():

  • використовується лише для Node.js файлів;
  • створює окремий процес Node.js;
  • підтримує вбудований канал обміну повідомленнями (IPC);
  • ідеально для паралельних обчислень і модульної архітектури.

4. Події об'єкта ChildProcess

ПодіяОпис
exitПроцес завершився
closeЗакрито всі потоки введення/виведення
errorПомилка при запуску
messageОтримано повідомлення (для fork())
disconnectIPC-канал закрито

5. Відмінність методів

МетодВикористовує оболонкуПовертає результатПотокове введення/виведенняТипова задача
execТакрядком (stdout)НіПрості команди
execFileНірядком (stdout)НіЗапуск виконуваних файлів
spawnНіПотоки (stdout, stderr)ТакПотокова обробка
forkНіЧерез IPC-повідомленняТакЗапуск Node.js воркерів

6. Де використовується на практиці

Реальні сценарії:

  • запуск Python- чи Go-програм із Node.js;
  • створення власних CLI-команд;
  • обробка зображень через ImageMagick, ffmpeg, sharp;
  • інтеграція з git, docker, kubectl;
  • розподіл обчислень по кількох процесах;
  • виконання cron-задач.

7. Важливо пам'ятати

  • Кожен процес має свою пам'ять і event loop.
  • Обмін даними між процесами йде через IPC (Inter-Process Communication).
  • exec() може зависнути, якщо буфер переповнений (за замовчуванням 1 МБ).
  • Якщо потрібно багато паралельних задач - краще використовувати worker_threads (легше, ніж процеси).
  • Для керування безліччю процесів часто використовують PM2 чи кластеризацію (cluster).

Підсумок

Критерійchild_process
ПризначенняЗапуск зовнішніх програм і процесів
Тип APIАсинхронний (на callback-ах чи подіях)
Методиexec, execFile, spawn, fork
Підтримка потоківЧерез stdout / stderr
Обмін данимиЧерез повідомлення (IPC) чи введення/виведення
Де використовуватиІнтеграція з зовнішніми командами, паралельні обчислення, автоматизація

Висновок:

Модуль child_process робить Node.js "оркестратором" - він може запускати будь-які програми, керувати ними, передавати їм дані й отримувати результати назад.

Це фундамент для CLI-інструментів, DevOps-скриптів, build-систем і розподілених обчислень.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.