Що робить модуль 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() - запуск команди й отримання результату
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() - потоковий запуск процесу
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() - запуск конкретного файлу
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
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
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()) |
disconnect | IPC-канал закрито |
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-систем і розподілених обчислень.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.