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

process.exit и незавершённые операции

Вопрос

Скрипт пишет большой отчёт в stdout, перенаправленный в файл, и последней строкой вызывает process.exit(0). Отчёт иногда обрезан. Почему?

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

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

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

Коротко

Правильный ответ: process.exit не ждёт асинхронную запись из буферов. Когда stdout это пайп, запись в него асинхронная. process.exit не ждёт очередь и обрывает её.

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

  1. Файловая система не успевает создать файл до первой записи
  2. Код выхода 0 означает «отменить незаписанный вывод»
  3. process.exit не ждёт асинхронную запись из буферовправильный ответ
  4. console.log в Node синхронный всегда, обрезка невозможна

Разбор

Когда stdout это пайп, запись в него асинхронная. process.exit не ждёт очередь и обрывает её. Лучше выставить process.exitCode = 0 и просто дать процессу завершиться, когда работа кончится.

  • Файл создаёт shell ещё до запуска процесса.
  • Код выхода на вывод не влияет.
  • Синхронность stdout зависит от того, куда он направлен: для файлов и TTY она синхронна, для пайпов на Linux асинхронна.

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

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