Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить модуль child_process?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)`child_process` - вбудований модуль Node.js для запуску дочірніх процесів: системних команд, зовнішніх програм чи інших Node.js-скриптів, через чотири методи - `exec`, `execFile`, `spawn` і `fork`. **Ключове:** `fork()` створює новий процес Node.js із вбудованим IPC-каналом, тоді як `spawn()` краще підходить для потокової обробки великого виводу.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що таке `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()`) | | `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-систем і розподілених обчислень.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.