exec, spawn и большой вывод
Вопрос
Сервис вызывает exec("pg_dump mydb") и получает ошибку stdout maxBuffer length exceeded, хотя команда отрабатывает нормально. Что правильно сделать?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
spawnи передатьstdoutпотоком черезpipeline, не копя в памятиправильный ответ- Поднять
maxBufferдо 10 ГБ, чтобы дамп целиком поместился - Запускать через
execсshell: false, тогда буфер не нужен - Перенаправить вывод в
/dev/null, а дамп взять из логов
Разбор
exec и execFile в режиме колбэка буферизуют весь stdout и stderr в память и ограничены maxBuffer (по умолчанию 1 МБ). Для дампа на гигабайты это неверный инструмент: даже с огромным maxBuffer процесс получит пик памяти размером с дамп. spawn отдаёт потоки, и их можно направить в файл, сжатие или S3 через pipeline с backpressure.
У exec нет режима без shell, это и есть его суть (для этого execFile). /dev/null выбросит сам результат.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Код-ревью: конвертация файлов через внешнюю утилиту
Следующий вопрос
Node как PID 1 в контейнере