Какая команда используется для выхода? (т.е. прекратить процесс Node.js)
Какая команда используется для выхода? (т.е. прекратить процесс Node.js)
Ответы:
Вызовите метод глобального process
объекта exit
:
process.exit()
process.exit ([код])
Завершает процесс указанным
code
. Если опущено, для выхода используется код успеха0
.Чтобы выйти с кодом «сбой»:
process.exit(1);
Оболочка, которая выполнила узел, должна видеть код выхода как
1
.
exit
не вводит в заблуждение вообще. Вы не знаете, как работает Node. Думайте об Узле как о самом сервере. Он не просто запускается по мере необходимости, как PHP внутри веб-сервера, как Apache. Node даже не имеет ничего общего с веб-серверами! Это просто хост для некоторого JavaScript, с некоторыми изящными встроенными библиотеками для выполнения полезных задач.
mod_php
или использовать Apache. Вы можете переопределить httpd в PHP, как это делает узел, если вы действительно хотите, или использовать более вменяемый / стандартизированный подход, такой как FastCGI, так же, как вы можете в узле.
process.exit()
это не рекомендуется , как описано в этом ответе ниже .
Просто к сведению , что использование 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; }
process.exit()
для чего предназначен.
Из официальной документации nodejs.org :
process.exit(code)
Завершает процесс указанным кодом. Если опущен, выход использует код «успеха» 0.
Чтобы выйти с кодом «сбой»:
process.exit(1);
code = 0; process.exit(code);
code
?
process.exit()
без параметров, так как код по умолчанию равен 0
process.exit(0);
и запустите его, node exit_0.js && echo 'success'
он скажет «успех». Если вы создадите exit_1.js с помощью process.exit(1);
и запустите, node exit_1.js && echo 'success'
он не скажет «успех», поскольку ваш процесс завершился с ненулевым значением (что указывает на «сбой» или «ненормальный выход» в оболочку). Кроме того, вы увидите различные значения, $?
если вы запустите node exit_1.js
vs node exit_0.js
(вы можете проверить, выполнив, node exit_1.js
а затем выполнив echo $?
).
Если вы находитесь в терминале Unix или в командной строке Windows и хотите выйти из узла REPL, либо ...
.exit
и нажмите Enter илиnode
REPL Ctrl + D для выхода является стандартным поведением, поэтому он также работает в Windows.
Из командной строки, .exit
это то , что вы хотите:
$ node
> .exit
$
Это задокументировано в документах REPL . REPL (Read-Eval-Print-Loop) - это то, что называется командной строкой узла.
Из обычной программы используйте process.exit([code])
.
Это зависит от причины, по которой вы готовы выйти из процесса node.js, но в любом случае process.exit()
это последний вариант для рассмотрения . Цитата из документации:
Важно отметить, что вызов
process.exit()
заставит процесс завершиться как можно быстрее, даже если все еще существуют незавершенные асинхронные операции, которые еще не завершены полностью, включая операции ввода-вывода дляprocess.stdout
иprocess.stderr
.В большинстве случаев нет необходимости вызывать
process.exit()
явно. Процесс Node.js завершится сам по себе, если в цикле событий нет дополнительной работы, ожидающей выполнения.process.exitCode
Свойство может сказать процесс, выход код для использования , когда процесс завершается корректно.
Давайте рассмотрим возможные причины, по которым вы можете выйти из процесса node.js, и почему вам следует избегать process.exit()
:
Если сценарий достиг своего конца и интерпретатор узла не завершил работу, это означает, что некоторые асинхронные операции все еще ожидают выполнения. На process.exit()
данном этапе неправильно принудительно завершать процесс . Лучше попытаться понять, что удерживает ваш скрипт от ожидаемого выхода . И когда вы решите это, вы можете использовать process.exitCode
для возврата любого результата в вызывающий процесс.
Например, если вы хотите элегантно завершить работу экспресс- приложения. В отличие от сценария командной строки, приложение 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.
Всегда лучше с throw
ошибкой, вы получите красиво отформатированную трассировку стека и сообщение об ошибке. Верхние уровни кода всегда могут решить, могут ли они обработать error ( catch
) или позволить ему завершить процесс. С другой стороны, process.exit(1)
молча завершит процесс, и у него не будет возможности восстановиться после этого. Это может быть единственным «преимуществом» process.exit()
, вы можете быть уверены, что процесс будет прекращен.
Process.exit()
Похоже, что излишнее избыточное для большинства приложений. Я искал эквивалент функции php's die () ... больше похоже на:throw new Error('die msg')
REPL (командная строка)
Нажмите ctrl + c
дважды
Введите .exit
и нажмите ввод
Файл сценария
process.exit(code)
Узел обычно выходит с кодом 0 когда больше не ожидают асинхронные операции.
process.exit(1)
должен использоваться для выхода с кодом ошибки. Это позволит нам сделать вывод, что узел не закрылся изящно и был вынужден закрыться.
Есть и другие коды выхода, такие как
3 - Внутренняя ошибка синтаксического анализа JavaScript (очень очень редко)
5 - фатальная ошибка в движке javascript v8
9 - неверный аргумент
Полный список см. В кодах выхода узла.
У меня есть приложение, которое я хотел:
Мне пришлось подключиться 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); });
process.exitCode
меня работать в инструменте командной строки, который я создаю (проверено на Node v4.3.0). Но я не мог заставить его вести себя так, как задокументировано. Это вполне могло бы быть крайним случаем с commander
- хотя github.com/tj/commander.js/… заставляет меня задуматься. Не уверен, что кто-нибудь еще видел эту проблему с узлом 4, но документирование на всякий случай для дальнейшего использования.
process.exitCode = 1
, процесс завершается с кодом 0.
Как указал @Dominic, выбрасывать неперехваченную ошибку лучше, чем вызывать process.exit ([code]) :
process.exitCode = 1;
throw new Error("my module xx condition failed");
Выходить
let exitCode = 1;
process.exit(exitCode)
Полезные коды выхода
1 - Catchall для общих ошибок 2 - Неправильное использование встроенных командных оболочек (согласно документации Bash) 126 - вызванная команда не может быть выполнена 127 - «команда не найдена» 128 - Неверный аргумент для выхода 128 + n - сигнал фатальной ошибки «n» 130 - Сценарий прекращен с помощью Control-C 255 \ * - выход из состояния вне диапазона
Из кода вы можете использовать process.exit([errorcode])
где [errorcode]
необязательное целое число ( 0
по умолчанию указывает на успех).
Если вы используете Read Eval Print Loop (REPL) , вы можете использовать Ctrl+ Dили набрать.exit
Кроме того, в Windows или Linux вы можете использовать Ctrl+ C, Ctrl+C
На Mac команда Ctrl+ Z, Ctrl+Z
node --version
v0.10.18
Нажмите Ctrl + C
дважды или .exit
.
>
(To exit, press ^C again or type .exit)
>
Я смог заставить все мои процессы узлов умереть непосредственно из оболочки Git Bash в Windows 10, набрав taskkill -F -IM node.exe
- это завершает все процессы узлов на моем компьютере одновременно. Я нашел, что я мог также использовать taskkill //F //IM node.exe
. Не уверен, почему так -
и //
работает в этом контексте. Надеюсь это поможет!
Поскольку процесс является глобальным объектом, вам не нужно импортировать какой-либо модуль. Следующая функция завершает или убивает текущий процесс узла.
process.exit (код)
process.kill (process.pid)
process.abort ()
Откройте терминал командной строки, где запущено приложение узла, и нажмите Ctrl + C
если вы хотите выйти из приложения js узла из кода,
process.exit(); // graceful termination
process.exit(1); // non graceful termination
если вы хотите выйти из приложения js узла, напишите
process.exit(1)
в вашем коде
Если вы хотите заставить цикл выполнения остановить процесс, вы можете использовать глобальную переменную process, которая является экземпляром EventEmitter . Поэтому, когда вы вызываете process.exit (), вы фактически генерируете событие выхода, которое немедленно завершает все задачи, даже если асинхронные операции еще не выполнены.
process.exit () принимает код выхода (Integer) в качестве параметра. Код 0 является значением по умолчанию, и это означает, что он завершается с «успехом». В то время как код 1 означает, что он завершается с «неудачей».
Если вы находитесь в Windows, перейдите в диспетчер задач, затем перейдите в раздел «Процессы», найдите процесс под названием «узел», затем щелкните по нему правой кнопкой мыши и выберите параметр «Завершить процесс».
Вы можете использовать process.exit ([code]) функцию .
Если вы хотите выйти без «сбоя», используйте код 0
:
process.exit(0);
Чтобы выйти с кодом «сбой», 1
вы можете запустить:
process.exit(1);
Код сбоя является специфическим для приложения. Таким образом, вы можете использовать свои собственные соглашения для этого.
end()
запрос. В противном случае он просто зависнет.