Выбор ответа Senior Файлы и процессы обновлено

exec, spawn и большой вывод

Вопрос

Сервис вызывает exec("pg_dump mydb") и получает ошибку stdout maxBuffer length exceeded, хотя команда отрабатывает нормально. Что правильно сделать?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: spawn и передать stdout потоком через pipeline, не копя в памяти. exec и execFile в режиме колбэка буферизуют весь stdout и stderr в память и ограничены maxBuffer (по умолчанию 1 МБ).

Варианты ответа

  1. spawn и передать stdout потоком через pipeline, не копя в памятиправильный ответ
  2. Поднять maxBuffer до 10 ГБ, чтобы дамп целиком поместился
  3. Запускать через exec с shell: false, тогда буфер не нужен
  4. Перенаправить вывод в /dev/null, а дамп взять из логов

Разбор

exec и execFile в режиме колбэка буферизуют весь stdout и stderr в память и ограничены maxBuffer (по умолчанию 1 МБ). Для дампа на гигабайты это неверный инструмент: даже с огромным maxBuffer процесс получит пик памяти размером с дамп. spawn отдаёт потоки, и их можно направить в файл, сжатие или S3 через pipeline с backpressure.

У exec нет режима без shell, это и есть его суть (для этого execFile). /dev/null выбросит сам результат.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.