Выбор ответа Middle Файлы и процессы обновлено
process.exit и незавершённые операции
Вопрос
Скрипт пишет большой отчёт в stdout, перенаправленный в файл, и последней строкой вызывает process.exit(0). Отчёт иногда обрезан. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: process.exit не ждёт асинхронную запись из буферов. Когда stdout это пайп, запись в него асинхронная. process.exit не ждёт очередь и обрывает её.
Варианты ответа
- Файловая система не успевает создать файл до первой записи
- Код выхода 0 означает «отменить незаписанный вывод»
process.exitне ждёт асинхронную запись из буферовправильный ответ- console.log в Node синхронный всегда, обрезка невозможна
Разбор
Когда stdout это пайп, запись в него асинхронная. process.exit не ждёт очередь и обрывает её. Лучше выставить process.exitCode = 0 и просто дать процессу завершиться, когда работа кончится.
- Файл создаёт shell ещё до запуска процесса.
- Код выхода на вывод не влияет.
- Синхронность stdout зависит от того, куда он направлен: для файлов и TTY она синхронна, для пайпов на Linux асинхронна.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.