spawn, exec, execFile, fork: что когда
Вопрос
Расскажи, какие способы запустить внешний процесс есть в Node.js и когда какой выбрать.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
spawn: потоковый вывод, для долгих программ и больших данных
exec: через shell, вывод буферизуется (maxBuffer 1 МБ), для коротких команд
execFile: без shell, безопаснее с пользовательскими аргументами
fork: Node-скрипт с IPC-каналом для обмена сообщениями
Sync-версии блокируют цикл, только для CLI и старта
Опасность exec: command injection
Что могут спросить следом
- Чем fork отличается от worker_threads?
- Как убить дочерний процесс вместе с его детьми?
Разбор
В child_process четыре основных функции. spawn запускает программу и даёт её stdout и stderr как потоки, поэтому подходит для долгих процессов и больших объёмов, например ffmpeg.
exec запускает строку через shell и отдаёт весь вывод в колбэке. Удобно для коротких команд вроде git rev-parse, но вывод ограничен maxBuffer, по умолчанию мегабайт, и есть риск command injection, если в строку попадает ввод пользователя.
execFile делает то же без shell: аргументы передаются массивом, и спецсимволы не интерпретируются. С внешними данными я выбираю его или spawn.
fork предназначен для Node-скриптов: он открывает IPC-канал, и процессы общаются сообщениями. Синхронные версии вроде execSync блокируют event loop, их место в CLI-скриптах, а не в сервере.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.