Как выйти в Node.js

1869

Какая команда используется для выхода? (т.е. прекратить процесс Node.js)

Брайан Филд
источник

Ответы:

2377

Вызовите метод глобального processобъекта exit:

process.exit()

Из документов:

process.exit ([код])

Завершает процесс указанным code. Если опущено, для выхода используется код успеха 0.

Чтобы выйти с кодом «сбой»:

process.exit(1);

Оболочка, которая выполнила узел, должна видеть код выхода как 1.

Pero P.
источник
5
Просто хочу что-то добавить. Если вы обрабатываете запрос, вы должны также end()запрос. В противном случае он просто зависнет.
pixelfreak
126
@pixelfreak, exitне вводит в заблуждение вообще. Вы не знаете, как работает Node. Думайте об Узле как о самом сервере. Он не просто запускается по мере необходимости, как PHP внутри веб-сервера, как Apache. Node даже не имеет ничего общего с веб-серверами! Это просто хост для некоторого JavaScript, с некоторыми изящными встроенными библиотеками для выполнения полезных задач.
Брэд
6
@Brad А PHP - это язык общего назначения. Нет необходимости запускать его mod_phpили использовать Apache. Вы можете переопределить httpd в PHP, как это делает узел, если вы действительно хотите, или использовать более вменяемый / стандартизированный подход, такой как FastCGI, так же, как вы можете в узле.
Бинки
38
Обратите внимание, что process.exit()это не рекомендуется , как описано в этом ответе ниже .
AndreasPizsa
410

Просто к сведению , что использование process.exit([number])является не рекомендуется практика.

Вызов process.exit()заставит процесс завершиться как можно быстрее, даже если все еще существуют незавершенные асинхронные операции, которые еще не завершены полностью, включая операции ввода-вывода для process.stdoutи process.stderr.

В большинстве случаев нет необходимости вызывать process.exit()явно. Процесс Node.js выйдет сам по себе, если в цикле обработки событий не ожидается дополнительная работа. process.exitCodeСвойство может сказать процесс, выход код для использования , когда процесс завершается корректно.

Например, следующий пример иллюстрирует злоупотребление этого process.exit()способа , который может привести к данным , напечатанных в stdoutусекается и потерял:

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exit(1);
}

Причина, по которой это проблематично, заключается в том, что записи process.stdoutв Node.js иногда бывают асинхронными и могут происходить в течение нескольких тактов цикла событий Node.js. Вызов process.exit(), однако, вынуждает процесс завершиться, прежде чем эти дополнительные записи stdoutмогут быть выполнены.

Вместо process.exit()непосредственного вызова код должен установить process.exitCodeи разрешить процессу естественный выход, избегая планирования какой-либо дополнительной работы для цикла событий:

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();  
  process.exitCode = 1;
}
Dominic
источник
31
Это лучший ответ, безусловно. Другие ответы могут не позволить узлу правильно обработать ожидающие события перед выходом, очень печально :(
djabraham
3
Согласитесь, это должно иметь больше голосов! У меня был скрипт узла, который запускал несколько дочерних процессов через shelljs.exec, и я хотел, чтобы мой общий скрипт возвращался с кодом завершения ошибки, если какой-либо из дочерних процессов завершился неудачно. process.exitCode = 1 отлично работал в обратных вызовах exec (тогда как простой вызов там process.exit (1) завершил бы главный сценарий до завершения всех дочерних процессов!)
Ник
15
Я использовал этот ответ и обнаружил, что мой процесс на самом деле никогда не завершался. Пришлось ctrl-C это.
jcollum
34
Существует множество вариантов использования для немедленного завершения процесса и ожидающего завершения события. Это именно то, process.exit()для чего предназначен.
Доминик Черизано
7
Это не самый лучший ответ с любой точки зрения, потому что он не отвечает на вопрос. Вместо этого он дает лучшие рекомендации по разработке потока кода для программы nodejs.
anon58192932
365

Из официальной документации nodejs.org :

process.exit(code)

Завершает процесс указанным кодом. Если опущен, выход использует код «успеха» 0.

Чтобы выйти с кодом «сбой»:

process.exit(1);
alienhard
источник
9
@Alison да, или точнееcode = 0; process.exit(code);
wprl
7
Правда ли, что если вы выходите, вам, вероятно, наплевать на ценность code?
Арманд
8
@Alison Лучшая идея - просто process.exit()без параметров, так как код по умолчанию равен 0
Джереми Мориц,
2
@Armand Вы правы - код - это просто переменная, и в этом случае используется для указания, что это за параметр. Так .exit (0) делает все, что делает пример.
Джерард ONeill
23
@ Арманд код не для тебя, он для того, что запускал твой код. Например, если вы создадите файл exit_0.js process.exit(0);и запустите его, node exit_0.js && echo 'success'он скажет «успех». Если вы создадите exit_1.js с помощью process.exit(1);и запустите, node exit_1.js && echo 'success'он не скажет «успех», поскольку ваш процесс завершился с ненулевым значением (что указывает на «сбой» или «ненормальный выход» в оболочку). Кроме того, вы увидите различные значения, $?если вы запустите node exit_1.jsvs node exit_0.js(вы можете проверить, выполнив, node exit_1.jsа затем выполнив echo $?).
MSA
277

Если вы находитесь в терминале Unix или в командной строке Windows и хотите выйти из узла REPL, либо ...

  • Нажмите Ctrl+ Cдважды или
  • введите .exitи нажмите Enter или
  • нажмите Ctrl+ Dв начале строки (только для Unix)
Мохсен
источник
14
Обратите внимание, что помимо Node, сочетание клавиш Ctrl + D на Mac или Linux работает практически со всеми оболочками и REPL, с которыми вы когда-либо сталкивались, включая оболочки Unix, такие как Bash, оболочки для баз данных, таких как MySQL и PostgreSQL, и REPL для языков программирования, таких как Python, PHP и Ruby. Это единственный метод выхода из снарядов, который я когда-либо использовал.
Марк Эмери
2
Для nodeREPL Ctrl + D для выхода является стандартным поведением, поэтому он также работает в Windows.
Алан
Нажмите Ctrl + C (даже на Mac!)
Принц
124

Из командной строки, .exitэто то , что вы хотите:

$ node
> .exit
$

Это задокументировано в документах REPL . REPL (Read-Eval-Print-Loop) - это то, что называется командной строкой узла.

Из обычной программы используйте process.exit([code]).

Майк М. Лин
источник
79

Это зависит от причины, по которой вы готовы выйти из процесса node.js, но в любом случае process.exit()это последний вариант для рассмотрения . Цитата из документации:

Важно отметить, что вызов process.exit()заставит процесс завершиться как можно быстрее, даже если все еще существуют незавершенные асинхронные операции, которые еще не завершены полностью, включая операции ввода-вывода для process.stdoutи process.stderr.

В большинстве случаев нет необходимости вызывать process.exit()явно. Процесс Node.js завершится сам по себе, если в цикле событий нет дополнительной работы, ожидающей выполнения. process.exitCodeСвойство может сказать процесс, выход код для использования , когда процесс завершается корректно.

Давайте рассмотрим возможные причины, по которым вы можете выйти из процесса node.js, и почему вам следует избегать process.exit() :

Случай 1 - Выполнение завершено (сценарий командной строки)

Если сценарий достиг своего конца и интерпретатор узла не завершил работу, это означает, что некоторые асинхронные операции все еще ожидают выполнения. На process.exit()данном этапе неправильно принудительно завершать процесс . Лучше попытаться понять, что удерживает ваш скрипт от ожидаемого выхода . И когда вы решите это, вы можете использовать process.exitCodeдля возврата любого результата в вызывающий процесс.

Случай 2 - Завершение из-за внешнего сигнала (SIGINT / SIGTERM / другое)

Например, если вы хотите элегантно завершить работу экспресс- приложения. В отличие от сценария командной строки, приложение Express работает бесконечно, ожидая новых запросов. process.exit()будет плохим вариантом, потому что он будет прерывать все запросы, которые находятся в конвейере. И некоторые из них могут быть неидемпотентными (ОБНОВЛЕНИЕ, УДАЛЕНИЕ). Клиент никогда не узнает, выполнены ли эти запросы на стороне сервера или нет, и это может быть причиной несоответствия данных между клиентом и сервером. Единственным хорошим решением является указание http-серверу прекратить принимать новые запросы и ждать, пока ожидающие завершат работу server.close():

var express = require('express');
var app = express();
var server = app.listen(80);

process.on( 'SIGTERM', function () {
   server.close(function () {
     console.log("Finished all requests");
   });
});

Если это все еще не выходит - см. Случай 1.

Случай 3 - Внутренняя ошибка

Всегда лучше с throwошибкой, вы получите красиво отформатированную трассировку стека и сообщение об ошибке. Верхние уровни кода всегда могут решить, могут ли они обработать error ( catch) или позволить ему завершить процесс. С другой стороны, process.exit(1)молча завершит процесс, и у него не будет возможности восстановиться после этого. Это может быть единственным «преимуществом» process.exit(), вы можете быть уверены, что процесс будет прекращен.

ТЭ
источник
4
Удивительный ответ. Process.exit()Похоже, что излишнее избыточное для большинства приложений. Я искал эквивалент функции php's die () ... больше похоже на:throw new Error('die msg')
AvadData
Если у вас есть набор кода, который должен выполняться непрерывно до получения запроса на отключение, есть ли хорошее соглашение для регистрации событий, которое позволит отказаться от подписок в ответ на запрос на отключение, не требуя кода, использующего события или код, запрашивающий отключение, имеет определенные знания друг о друге? К сожалению, единственный способ, который я могу придумать для своего рода реализации, состоит в том, чтобы потребовать, чтобы любой фрагмент кода, который регистрирует событие, также создавал оболочку, которая включает замыкание для его отмены.
суперкат
26

REPL (командная строка)

  • Нажмите ctrl + c дважды

  • Введите .exitи нажмите ввод

Файл сценария

process.exit(code)

Узел обычно выходит с кодом 0 когда больше не ожидают асинхронные операции.

process.exit(1) должен использоваться для выхода с кодом ошибки. Это позволит нам сделать вывод, что узел не закрылся изящно и был вынужден закрыться.

Есть и другие коды выхода, такие как

3 - Внутренняя ошибка синтаксического анализа JavaScript (очень очень редко)

5 - фатальная ошибка в движке javascript v8

9 - неверный аргумент

Полный список см. В кодах выхода узла.

Шива Пракаш
источник
12

У меня есть приложение, которое я хотел:

  1. Отправить электронное письмо пользователю
  2. Выход с кодом ошибки

Мне пришлось подключиться process.exit(code)к exitобработчику событий, иначе письмо не будет отправлено, поскольку вызов process.exit(code)напрямую убивает асинхронные события.

#!/usr/bin/nodejs
var mailer = require('nodemailer');
var transport = mailer.createTransport();
mail = {
  to: 'Dave Bowman',
  from: 'HAL 9000',
  subject: 'Sorry Dave',
  html: 'Im sorry, Dave. Im afraid I cant do <B>THAT</B>.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });
Стивен Куан
источник
4
Я думаю, что вы хотите process.exitCode
Джулиан де Бхал
Для справки: я потратил большую часть дня, пытаясь заставить process.exitCodeменя работать в инструменте командной строки, который я создаю (проверено на Node v4.3.0). Но я не мог заставить его вести себя так, как задокументировано. Это вполне могло бы быть крайним случаем с commander- хотя github.com/tj/commander.js/… заставляет меня задуматься. Не уверен, что кто-нибудь еще видел эту проблему с узлом 4, но документирование на всякий случай для дальнейшего использования.
mikermcneil
По поводу возможности этого исходить от командира, я также посмотрел на его единственное депо ( github.com/zhiyelee/graceful-readlink/… ), но без кубиков. Единственно возможный виновник может выглядеть так : github.com/tj/commander.js/blob/… В частности, проблема в том, что, даже если вы установите process.exitCode = 1, процесс завершается с кодом 0.
mikermcneil
11

Как указал @Dominic, выбрасывать неперехваченную ошибку лучше, чем вызывать process.exit ([code]) :
process.exitCode = 1; throw new Error("my module xx condition failed");

MANN
источник
3
Взятый в контексте вопроса «Как выйти в Node.js», это ужасный совет. Ваше предложение имело бы гораздо больше смысла, если бы в вопросе конкретно спрашивалось, как выйти из ошибки. Я настоятельно рекомендую вам сформулировать свой ответ таким образом, чтобы указать, что пользователь делает то, что вы предлагаете, только если он пытается выйти из приложения в случае ошибки .
rstackhouse
@rstackhouse, я надеюсь, что вы прошли через ошибку, которая указывает на -> nodejs.org/api/process.html#process_process_exit_code
MANN
5
Проблема с метанием - это ужасная трассировка стека. Любой совет, чтобы избежать этой трассировки стека (не актуально, когда инструмент CLI хочет выйти, если использование не правильно)?
MoOx
9

Выходить

let exitCode = 1;
process.exit(exitCode)

Полезные коды выхода

1 - Catchall для общих ошибок
2 - Неправильное использование встроенных командных оболочек (согласно документации Bash)
126 - вызванная команда не может быть выполнена
127 - «команда не найдена»
128 - Неверный аргумент для выхода
128 + n - сигнал фатальной ошибки «n»
130 - Сценарий прекращен с помощью Control-C
255 \ * - выход из состояния вне диапазона
Денис Лисицкий
источник
Рассмотрите возможность обновления своего ответа, nodejs.org/api/process.html#process_process_exit_code
Cmag
7

Из кода вы можете использовать process.exit([errorcode])где [errorcode]необязательное целое число ( 0по умолчанию указывает на успех).

Если вы используете Read Eval Print Loop (REPL) , вы можете использовать Ctrl+ Dили набрать.exit

Кроме того, в Windows или Linux вы можете использовать Ctrl+ C, Ctrl+C

На Mac команда Ctrl+ Z, Ctrl+Z

zzzzBov
источник
2
Два контрольных с тоже работают на node --version v0.10.18
маке
Control-C, похоже, не отменяет операции, которые уже были запланированы, в то время как ctrl-z убивает процесс без задержки на Mac.
Джорис
7

Нажмите Ctrl + Cдважды или .exit.

> 
(To exit, press ^C again or type .exit)
> 
HeadAndTail
источник
3

Я смог заставить все мои процессы узлов умереть непосредственно из оболочки Git Bash в Windows 10, набрав taskkill -F -IM node.exe- это завершает все процессы узлов на моем компьютере одновременно. Я нашел, что я мог также использовать taskkill //F //IM node.exe. Не уверен, почему так -и //работает в этом контексте. Надеюсь это поможет!

Элисон Стюарт
источник
Это связано с самой задачей. Вы сами убиваете процессы. Кроме того, одного / достаточно.
Пол Стелян
2

Поскольку процесс является глобальным объектом, вам не нужно импортировать какой-либо модуль. Следующая функция завершает или убивает текущий процесс узла.

process.exit (код)

process.kill (process.pid)

process.abort ()

sumit_suthar
источник
1

Откройте терминал командной строки, где запущено приложение узла, и нажмите Ctrl + C

если вы хотите выйти из приложения js узла из кода,

process.exit(); // graceful termination 
process.exit(1); // non graceful termination 
Шекар Мания
источник
0

если вы хотите выйти из приложения js узла, напишите

process.exit(1)

в вашем коде

Аджай Мудалияр
источник
3
1 используется для указания на то, что в приложении произошла ошибка, которую другие ответы уже разъясняют.
Херик
0

Выход в узел js выполняется двумя способами:

  • Вызов process.exit () явно.
  • Или, если цикл событий nodejs выполнен со всеми задачами, и ничего не остается сделать. Затем приложение узла автоматически закроется.

Как это работает?

Если вы хотите заставить цикл выполнения остановить процесс, вы можете использовать глобальную переменную process, которая является экземпляром EventEmitter . Поэтому, когда вы вызываете process.exit (), вы фактически генерируете событие выхода, которое немедленно завершает все задачи, даже если асинхронные операции еще не выполнены.

process.exit () принимает код выхода (Integer) в качестве параметра. Код 0 является значением по умолчанию, и это означает, что он завершается с «успехом». В то время как код 1 означает, что он завершается с «неудачей».

Маджид Джиджи
источник
0

Если вы находитесь в Windows, перейдите в диспетчер задач, затем перейдите в раздел «Процессы», найдите процесс под названием «узел», затем щелкните по нему правой кнопкой мыши и выберите параметр «Завершить процесс».

Альбос Хайдари
источник
-1

Вы можете использовать process.exit ([code]) функцию .

Если вы хотите выйти без «сбоя», используйте код 0:

process.exit(0);

Чтобы выйти с кодом «сбой», 1вы можете запустить:

process.exit(1);

Код сбоя является специфическим для приложения. Таким образом, вы можете использовать свои собственные соглашения для этого.

Алексей Трехлеб
источник