Как выключить сервер node js

Изящное отключение в NodeJS

Как выключить сервер node js

В этой статье я собираюсь показать вам, как выполнить постепенное завершение работы в приложении NodeJS, но сначала давайте опишем, что означает «постепенное завершение работы» и почему мы должны делать это в нашем приложении и каковы его преимущества.

Изящное отключение

Давайте представим, что у вас есть HTTP-сервер с NodeJS, который подключен к базе данных, и каждый раз, когда сервер вызывается, он отправляет запрос в базу данных, чтобы получить / установить данные, которые также будут отправлены клиенту в ответе.

-Это заставляет задуматься, верно?

Как вы можете догадаться, вам нужно обработать все запросы и закрыть все ресурсы, которые обрабатывают данные (например, соединения с базой данных), и не принимать никаких других запросов, и после этого вы можете спокойно отключить сервер.

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

Вот четыре шага того, как вы можете сделать постепенное отключение простым способом.

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

Давайте создадим простой сервер NodeJS и выполним все шаги, которые я упомянул выше, которые будут корректно завершаться, когда мы хотим закрыть сервер и понять, как он работает.

Вот простой пример NodeJS Server с использованием ExpressJS

Здесь у нас есть простой сервер с маршрутом, который создает пользователя в MongoDB.

С помощью этой команды мы можем протестировать сервер и создать пользователя в базе данных.

Теперь давайте пройдемся по четырем шагам и напишем соответствующий код для этого.

1. Обработка сигнала уничтожения процесса

Сначала давайте разберемся, что такое сигнал процесса.

Сигнал представляет собой асинхронное уведомление отправляется в процесс или определенный поток, чтобы уведомить событие, которое произошло.

Сигнальные события будут генерироваться, когда процесс NodeJS получит сигнал.

Каждый сигнал имеет имя (например, «SIGINT», «SIGTERM» и т.д.), подробнее об этом в NodeJS здесь.

‘SIGINT’ генерируется с помощью + C в терминале. Сигнал ‘SIGTERM’ является общим сигналом, используемым для завершения программы. В отличие от ‘SIGKILL’ этот сигнал может быть заблокирован, обработан и проигнорирован. Это нормальный способ вежливо попросить программу завершиться. Команда оболочки kill генерирует ‘SIGTERM’ по умолчанию.

Вы можете прочитать больше о сигналах завершения здесь.

Как вы думаете, нам нужно добавить обработчик, который будет получать сигнал «SIGTERM».

Вот следующий пример, построенный на предыдущем примере, который обрабатывает сигнал.

Теперь давайте попробуем и проверим это.

SIGTERM сигнал получен.

Если вы попытаетесь снова, вы получите тот же лог

SIGTERM сигнал получен.

-Хммм, почему процесс не был убит?

Потому что вы обработали сигнал и проигнорировали его.

Итак, первый шаг сделан, давайте перейдем к следующему шагу.

2. Остановка новых запросов от клиента

Теперь нам нужно остановить http-сервер и перестать принимать новые запросы.

Это можно сделать с помощью функции server.close, чтобы получить больше информации можете посетить страницу документации NodeJS.

Наш код будет выглядеть так

Он прекратит прием новых подключений к серверу, и если вы попытаетесь вызвать сервер, ваш запрос не будет выполнен.

3. Закрытие всех текущих процессов

В этом примере смысл заключается в том, чтобы закрыть соединение MongoDB, поскольку к базе данных не осталось запросов.

Так что это можно сделать с помощью этого кода

-Хммммм, почему Node сервер выходит после закрытия соединения с БД.

Это очень интересный вопрос, вы можете попытаться понять этот вопрос самостоятельно, но если вы не можете или не хотите, я опишу его в следующей главе.

4. Выход из процесса

Как вы уже видели, наше приложение закрывает соединение с базой данных.

Как мы знаем, NodeJS выйдет, когда очередь EventLoop пуста и ничего не останется.

Но иногда ваше приложение может иметь больше функций и не будет закрываться автоматически, в этом пункте наша последняя работа. Нам нужно выйти из процесса, используя функцию process.exit.

И последний пример изящного выключения сервера будет выглядеть так

Аргумент 0 означает выход с кодом «успеха».

Для выхода скодом «сбой» используйте 1.

Чтобы получить этот код выхода после завершения работы, выполните эту команду в терминале, где вы запускаете сервер вашего Node приложения.

По умолчанию NodeJS завершается с кодом процесса 0, если EventLoop пуст.

Резюме

Это не единственный способ корректно завершить работу сервера, он отлично подойдет для небольших проектов и может быть легко написан, но я не говорю, что в больших проектах он не нужен. В больших проектах, более вероятно использующих балансировку серверов (например, Nginx), вы можете балансировать нагрузку, не отправлять запросы на этот сервер и не завершать его.

Источник

О завершении работы Node.js-процессов

Существует несколько способов намеренного завершения работы процесса. Среди них — следующие:

ОперацияПример
Ручной выход из процесса
Неперехваченная ошибка
Необработанное отклонение промиса
Проигнорированное событие error
Необработанный сигнал

Ручной выход из процесса

Этот Node.js-однострочник ничего в консоль не выведет. Правда, воспользовавшись возможностями командной оболочки, можно узнать статус завершения процесса. Пользователь программы, столкнувшись с тем, что она завершила работу подобным образом, не поймёт того, что произошло.

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

Стоит отметить, что метод process.exit() — это весьма мощный механизм. Хотя у него есть своё место в коде приложений, его категорически не рекомендуется использовать в библиотеках, рассчитанных на многократное использование. Если ошибка произошла в библиотеке, библиотека должна её выбросить. Это позволит приложению, использующему библиотеку, самостоятельно принять решение о том, как обрабатывать эту ошибку.

Исключения, отклонения промисов, выдача событий error

Экземпляры класса Error содержат метаданные, которые полезны в деле определения причины ошибки. Например — данные трассировки стека и строки с сообщениями об ошибке. Распространённой является практика построения на основе класса Error классов ошибок, рассчитанных на конкретное приложение. При этом одно лишь создание экземпляра класса Error не приводит к каким-то заметным последствиям. Экземпляр ошибки нужно не только создать, но и выбросить.

А вот пример того, что при выполнении подобного кода выводится в консоли:

Отклонённые промисы, в отличие от неперехваченных исключений, не приводят, в Node.js v14, к остановке процесса. В будущих версиях Node.js отклонённые промисы будут завершать работу процессов. Подобные события, как и в случае с событиями ошибок, можно перехватывать с помощью объекта process :

Сигналы

В разных операционных системах могут быть определены различные сигналы. Ниже приведён список сигналов, которые, по большей части, универсальны.

ИмяКодПодлежит ли сигнал обработкеСтандартная реакция Node.jsЦель сигнала
1ДаЗавершение работыЗакрытие терминала
2ДаЗавершение работыСигнал прерывания (Ctrl+C) с терминала
3ДаЗавершение работыСигнал Quit с терминала (Ctrl+D)
9НетЗавершение работыБезусловное завершение процесса
10ДаЗапуск отладчикаПользовательский сигнал №1
12ДаЗавершение работыПользовательский сигнал №2
15ДаЗавершение работыЗапрос на завершение работы процесса
19НетЗавершение работыОстановка выполнения процесса

Если в программе может быть реализован механизм обработки соответствующего сигнала — в столбце таблицы «Подлежит ли сигнал обработке» стоит «Да». Два сигнала из таблицы с «Нет» в этой колонке обработке не подлежат. В столбце «Стандартная реакция Node.js» описана стандартная реакция Node.js-программы на получение соответствующего сигнала. В столбце «Цель сигнала» приведено описание стандартного общепринятого подхода к использованию сигналов.

Для обработки этих сигналов в Node.js-приложении можно воспользоваться уже знакомым нам механизмом объекта process по прослушиванию событий:

Возможно, вы уже догадались о том, что Node.js-программы могут отправлять сообщения другим программам. Выполните следующую команду, которая демонстрирует отправку сообщения от короткоживущего процесса работающему процессу:

В ответ на эту команду наш процесс покажет то же SIGHUP-сообщение, что показывал ранее. А если же работу этого процесса нужно завершить, ему надо отправить необрабатываемый сигнал SIGKILL :

После этого работа программы должна завершиться.

Источник

Как остановить сервер node.js, не убивая процесс?

Скажем, сервер создается следующим образом:

есть ли способ остановить его от node.js, например, не завершая/не убивая весь процесс?

Кроме того, вот более сложный пример, который не останавливается независимо от IP, к которому привязан сервер:

5 ответов

Переход ко 2-му, более реалистичному случаю: закройте текущее соединение перед вызовом server.close :

Если это сервер HTTP или HTTPS, это поможет, если вы закроете сокет запроса следующим образом:

Надеюсь, это поможет.

Вот пример, демонстрирующий, что, по-моему, вам нужно.

server.close() предотвращает новые подключения и ждет, пока все клиенты не будут закрыты.

Когда клиент подключается, следите за сокетом.

Я пытаюсь автоматизировать извлечение сетевых журналов из устройства Android в систему Windows. Для этого мне нужно отправить несколько команд. Я могу сбить большинство из них, но теперь я застрял там, где мне нужно остановить процесс tcpdump и скопировать файл захвата с устройства с помощью adb.

Похожие вопросы:

Я хочу знать, есть ли способ остановить сценарий python, когда он работает, не убивая его. Например, я знаю, что ctrl + z or c убьет текущие процессы.. но я не хочу убивать программу.. моя программа.

Я хотел бы знать, есть ли способ программно остановить выполнение скрипта python, не убивая процесс, как мы делаем с этим кодом: import sys sys.exit() Это будет код, эквивалентный Ctrl+c

Я использую node.js код, которые преобразуют оси принадлежат продукту ipcamera видео трансляция в mp4 используя FFMPEG var childProcess=require(‘child_process’); var childArguments = []; var.

У меня есть проект RubyOnRails, и я развернул его с Unicorn на nginx на сервере Ubuntu. Мне нужно перезапустить Unicorn, если я изменю один из конфигурационных файлов, но это делает мой сайт.

Я запускаю сервер node.js с 3000 портами nohup для фонового запуска, но теперь я хочу остановить сервер node.js с 3000 и начать снова с того же порта. Как я могу остановить этот процесс? я могу.

Я пытаюсь автоматизировать извлечение сетевых журналов из устройства Android в систему Windows. Для этого мне нужно отправить несколько команд. Я могу сбить большинство из них, но теперь я застрял.

Я пытаюсь использовать обучение с подкреплением в Webots с keras-rl, но сброс мира с помощью supervisor bot убивает весь процесс python. Есть ли способ сбросить симуляцию, не убивая процесс? Я.

Источник

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

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

21 ответ

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

process.exit([exitcode])

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

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

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

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

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

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

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

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

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

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

Дважды нажмите ctrl + c

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

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

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

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

Источник

Остановите программу node.js из командной строки

У меня есть простой TCP-сервер, который прослушивает порт.

Я закрываю программу неправильно? Как я могу предотвратить это?

11 ответов

Ctrl + Z приостанавливает его, что означает, что он все еще может работать.

Ctrl + C фактически убьет его.

Найдите идентификатор процесса (второй слева):

Это также может работать

Или, альтернативно, вы можете сделать все это в одной строке:

Вы можете заменить node внутри ‘\ snode\s’ на любое другое имя процесса.

Если вы выполняете Node.js в интерактивном режиме (REPL):

Ctrl + C вернет вас в > приглашение, затем введите:

$ sudo killall node в другом терминале работает с mac, а killall node не работает:

Скорее всего, вы сейчас в командной строке.

Дайте команде fg возобновить процесс на переднем плане.

или, если у вас нет pkill, это может сработать:

иногда процесс перечисляет свой собственный grep, и в этом случае вам понадобится:

h/t @ruffin из комментариев по самому вопросу. У меня была такая же проблема, и его комментарий помог мне решить ее сам.

Я добавляю этот ответ, потому что для многих проектов с производственными развертываниями у нас есть скрипты, которые останавливают эти процессы, поэтому нам не нужно.

Чистым способом управления процессами сервера Node является использование пакета forever (от NPM ).

Пример:

Установить Forever

Запустить Node Сервер

Результат:

info: Forever processing file: server.js

Выключение Node Сервер

forever stop server.js

Результат

info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj «/usr/bin/nodejs/node»

/path/to/your/project/server.js 23084 13176

Это приведет к чистому отключению вашего приложения Server.

Хотя это поздний ответ, я нашел это из Документы NodeJS:

Итак, чтобы подвести итог, вы можете выйти:

Если вы хотите остановить свой сервер с помощью npm stop или что-то вроде этого. Вы можете написать код, который убивает ваш серверный процесс следующим образом:

Примечание. Этот пример находится в оболочке bash на Mac.

Чтобы сделать это, я обязательно сделаю мой вызов node максимально конкретным. Например, вместо вызова node server.js из каталога приложений я вызываю node app_name_1/app/server.js

Это приведет только к уничтожению процесса node с запуском app_name_1/app/server.js.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *