Перейти к содержимому

Как остановить node js сервер

  • автор:

как остановить сервер node js

Чтобы остановить сервер Node.js, необходимо нажать «Ctrl + C» в терминале, в котором запущен сервер. Ниже приведен пример:

[process был прерван] 

Видим, что в терминале появилось сообщение, процесс был прерван. Теперь сервер Node.js остановлен и не будет прослушивать соединения.

Также, есть возможность удаленного управления процессами на Node.js. Одним из таких решений является pm2 process manager.

Как остановить сервер в NodeJs?

Здравствуйте!
Я подключился к серверу через SSH. и работаю в консоль PuTTY
Запустил вебсокет сервер..все норм но как её теперь остановить? когда нажимаю на CTRL+C просто закрывает консоль. а теперь как остановить сервер?(и перезагрузить)

  • Вопрос задан более трёх лет назад
  • 5111 просмотров

5 комментариев

Простой 5 комментариев

hahenty

killall node

dilikpulatov

Дилик Пулатов @dilikpulatov Автор вопроса
Сергей Сергей, прям так написать в консоль?

Krasnodar_etc

Егор Живагин @Krasnodar_etc

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

hahenty

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

dilikpulatov

Дилик Пулатов @dilikpulatov Автор вопроса
Егор Живагин, нужно перезапустить один из сервер
Решения вопроса 0
Ответы на вопрос 1

Xuxicheta

это зависит от того, как вы его запускали. Что такое «вебсокет сервер»?
Если просто node server.js
то проще всего killall node или kill _pid_процесса_

Ответ написан более трёх лет назад

dilikpulatov

Дилик Пулатов @dilikpulatov Автор вопроса

killall node и kill _pid_процесса_ не работает. пишет что такое команда нету
я подключился к сервер через PuTTY
там установлено Виндовс
просто залил свой проект(ведсокет на ноде) и запускал через команду node index.js и все.
нод сервер работает но теперь не могу её остановить.
PuTTY когда нажимаю CTRL+C просто закрывается консоль
и ещё пробовал команду
pkill —signal SIGINT node-chat
node-chat — здесь process.title = ‘node-chat’; в начале файл index.js то есть ID

Xuxicheta

Дилик Пулатов,
pkill тоже подойдет
да, killall может быть не установлен. Это в общем тоже самое, только убивает все подходящие под паттерн процессы

pkill «node-chat» должен сработать, если действительно задан process.title

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

Node.js-процессы завершают работу по разным причинам. При этом в некоторых случаях «смерть» процесса можно предотвратить. Например — в ситуации, когда причиной остановки процесса может стать необработанная ошибка. А вот иногда с остановкой процесса ничего поделать нельзя. Например — если её причина кроется в нехватке памяти. В Node.js существует глобальный объект process , являющийся экземпляром класса EventEmitter . Этот объект, при нормальном завершении процесса, генерирует событие exit . Код приложения может прослушивать это событие и, при его возникновении, выполнять, в синхронном режиме, некие операции по освобождению ресурсов.

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

process.exit(1)
throw new Error()
Promise.reject()
EventEmitter#emit('error')
$ kill

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

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

Подход к завершению работы Node.js-процессов, при котором используется команда вида process.exit(code) , это — самый простой и понятный механизм такого рода, который имеется у разработчика. Эта команда весьма полезна при разработке программ, в коде которых есть место, момент достижения которого означает, что работа программы завершена. Значение code , которое передаётся методу process.exit() , является необязательным, оно может принимать значения от 0 до 255, по умолчанию оно устанавливается в 0. 0 означает успешное завершение процесса, любое ненулевое значение говорит о том, что при работе процесса что-то пошло не так. Подобные значения используются различными внешними по отношению к Node.js-процессам программами. Например, если запуск набора тестов завершился с ненулевым кодом, это означает, что системе не удалось успешно выполнить этот набор тестов.

Когда вызывается команда process.exit() , это не приводит к выводу в консоль какого-либо стандартного сообщения. Если вы написали код, в котором этот метод вызывается при возникновении какой-то ошибки, вам надо предусмотреть вывод сведений об этой ошибке, нужно сообщить пользователю программы о проблеме. Например — попробуйте запустить такой код:

$ node -e "process.exit(42)" $ echo $? 

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

А вот — более удачный пример использования process.exit() . Этот код представляет собой фрагмент программы, в котором, если некий конфигурационный объект настроен неправильно, осуществляется выход из процесса с предварительным выводом сообщения об ошибке:

function checkConfig(config) < if (!config.host) < console.error("Configuration is missing 'host' parameter!"); process.exit(1); >> 

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

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

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

Метод process.exit() — это полезный инструмент, применимый для борьбы с ошибками, возникающими при запуске программ и при наличии проблем с их первоначальными настройками. Но он не очень хорошо подходит в тех случаях, когда речь идёт об ошибках времени выполнения. Тут нужны другие инструменты. Например, когда приложение занимается работой с HTTP-запросами, ошибка, возникшая в ходе обработки запроса, вероятно, не должна приводить к остановке процесса. Программа всего лишь должна вернуть ответ с сообщением об ошибке. Тут пригодятся и сведения о том, где именно произошла ошибка. Именно в подобных ситуациях очень кстати оказываются объекты Error .

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

Ошибки выбрасывают, используя ключевое слово throw . Ошибки, при наличии каких-то проблем в коде, могут выбрасываться и автоматически. Когда это происходит — производится «раскручивание» стека вызовов. То есть — происходит выход из всех функций, цепочка вызовов которых привела к достижению места выброса ошибки. Делается это до тех пор, пока не будет достигнута функция, в которой соответствующий вызов помещён в выражение try/catch . После этого ошибка перехватывается и вызывается код, который имеется в ветви выражения catch . Если же при вызове кода, в котором была выброшена ошибка, выражение try/catch не использовалось, такая ошибка считается неперехваченной.

Хотя предполагается, что ключевое слово throw нужно использовать лишь для выбрасывания ошибок (например — так: throw new Error(‘foo’) ), оно, с технической точки зрения, позволяет «выбрасывать» всё что угодно. Если что-то выброшено с помощью throw — это «что-то» считается исключением. Настоятельно рекомендуется выбрасывать с помощью throw именно экземпляры класса Error , так как код, который перехватывает объекты, выброшенные throw , весьма вероятно, рассчитывает на то, что это будут объекты, представляющие ошибки и имеющие соответствующие свойства.

Среди свойств объектов-ошибок можно отметить свойство .code , представляющее код ошибки. Оно было популяризировано благодаря его использованию во внутренних Node.js-библиотеках. Это свойство содержит задокументированное строковое значение, которое не должно меняться между релизами системы. В качестве примера кода ошибки можно привести ERR_INVALID_URI . Несмотря на то, что описание ошибки, предназначенное для программистов и хранящееся в свойстве .message , может меняться, то, что хранится в свойстве .code , меняться не должно.

К сожалению, один из широко распространённых подходов, используемых для различения ошибок, заключается в исследовании свойства .message соответствующих объектов. А ведь значение этого свойства в разных версиях системы вполне может меняться. Это — рискованный и чреватый ошибками подход к обработке ошибок. Правда, надо сказать, что в экосистеме Node.js не существует идеального механизма различения ошибок, который подходит для работы со всеми существующими библиотеками.

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

/tmp/foo.js:1 throw new TypeError('invalid foo'); ^ Error: invalid foo at Object. (/tmp/foo.js:2:11) . удалено для краткости . at internal/main/run_main_module.js:17:47 

Эти данные позволяют нам сделать вывод о том, что ошибка произошла в строке 2, в 11 столбце кода файла foo.js .

Как уже было сказано, глобальный объект process является экземпляром EventEmitter . Его можно использовать для «ловли» неперехваченных ошибок. А именно, его можно настроить на прослушивание события uncaughtException . Вот пример использования такого подхода, когда ошибка перехватывается, после чего отправляется асинхронное сообщение, а уже потом осуществляется выход из процесса:

const logger = require('./lib/logger.js'); process.on('uncaughtException', (error) => < logger.send("An uncaught exception has occured", error, () =>< console.error(error); process.exit(1); >); >); 

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

Promise.reject(new Error('oh no')); (async () => < throw new Error('oh no'); >)(); 

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

(node:52298) UnhandledPromiseRejectionWarning: Error: oh no at Object. (/tmp/reject.js:1:16) . удалено для краткости . at internal/main/run_main_module.js:17:47 (node:52298) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). 

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

process.on('unhandledRejection', (reason, promise) => <>); 

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

Когда объект EventEmitter выдаёт событие error , и при этом нет прослушивателя, ожидающего появления этого события, объект выбросит аргумент, который был выдан в виде события. Это приведёт к выдаче ошибки и станет причиной завершения работы процесса. Вот пример того, что в подобной ситуации попадает в консоль:

events.js:306 throw err; // Необработанное событие 'error' ^ Error [ERR_UNHANDLED_ERROR]: Unhandled error. (undefined) at EventEmitter.emit (events.js:304:17) at Object. (/tmp/foo.js:1:40) . удалено для краткости . at internal/main/run_main_module.js:17:47

Не забывайте о прослушивании событий в экземплярах EventEmitter , с которыми вы работаете. Это позволит приложению корректно обрабатывать подобные события, не останавливаясь при их возникновении.

Сигналы

Сигналы — это механизм, работа которого обеспечивается операционной системой. Они представляют собой короткие числовые сообщения, отправляемые одной программой другой программе. В качестве названий этих числовых сообщений часто пользуются строковыми именами соответствующих им констант. Например, имени SIGKILL соответствует числовой сигнал с кодом 9 . Сигналы применяют, преследуя различные цели, но надо отметить, что часто они, так или иначе, используются для остановки программ.

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

SIGHUP
SIGINT
SIGQUIT
SIGKILL

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

Я запускаю его с помощью node server.js , а затем закрываю его с помощью Ctrl + Z на Mac. Когда я пытаюсь запустить его снова с помощью node server.js , я получаю следующее сообщение об ошибке:

node.js:201 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: listen EADDRINUSE at errnoException (net.js:670:11) at Array.0 (net.js:771:26) at EventEmitter._tickCallback (node.js:192:41) 

Я неправильно закрываю программу? Как я могу предотвратить это? node.js command
Поделиться Источник 09 мая 2012 в 19:05

19 ответов

Чтобы завершить программу, вы должны использовать Ctrl + C . Если вы это сделаете, она отправляет SIGINT , что позволяет программе завершаться красиво, отвязывая от любых портов, на которые она слушает. См. также: https://superuser.com/a/262948/48624

Поделиться 09 мая 2012 в 19:16

Ctrl + Z приостанавливает его, что означает, что он все еще может быть запущен. Ctrl + C фактически уничтожит его. Вы также можете убить его вручную, как показано ниже:

ps aux | grep node 

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

kill -9 PROCESS_ID 

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

killall node 

Поделиться 09 мая 2012 в 19:21
Или, как альтернатива, вы можете сделать все это в одной строке:

kill -9 $(ps aux | grep '\snode\s' | awk '') 

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

Возобновите и убейте процесс:

  1. Дайте команду fg для возобновления процесса на переднем плане.
  2. введите Ctrl + C , чтобы правильно его убить.

Alternatively, вы можете убить его вручную, как показано ниже:

(NOTE: следующие команды могут требовать root, поэтому sudo. ваш друг)

pkill -9 node 

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

killall node 

или, возможно, так:

kill $(ps -e | grep node | awk '') 

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

kill $(ps -e | grep dmn | awk '') 

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

Поделиться 26 мая 2017 в 21:48

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

Ctrl + C вернет вас к > prompt, затем введите:

process.exit() 

или просто используйте Ctrl + D .

Поделиться 15 февраля 2014 в 07:54

Вы можете ввести .exit , чтобы выйти из node js REPL

Поделиться 22 июля 2013 в 10:12

На Linux попробуйте: pkill node

Taskkill /IM node.exe /F 
from subprocess import call call(['taskkill', '/IM', 'node.exe', '/F']) 

Поделиться 18 июля 2018 в 18:26

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

$ killall node No matching processes belonging to you were found 

Поделиться 18 июня 2013 в 12:53

Вы можете работать с следующей командой, чтобы быть конкретной в локальном kill server (здесь: 8000)

$:lsof -i tcp:8000 

Она даст вам следующие группы TCP:

КОМАНДА ПИД ИСПОЛЬЗОВАТЕЛЯ FD ТИПЕ РАЗМЕР РАЗМЕРОС/ИМЯ НОДА

node 21521 ubuntu 12u IPv6 345668 0t0 TCP *:8000 (LISTEN)

$:kill -9 21521 

Она убьет processId, соответствующий TCP*:8000

Поделиться 17 августа 2019 в 13:42

Вы можете использовать fuser, чтобы получить то, что вы хотите сделать.

Для получения идентификаторов процессов задач, работающих на порту, вы можете сделать следующее:

fuser >/tcp 

Допустим, порт 8888, команда становится:

fuser 8888/tcp 

А чтобы убить процесс, работающий на порту, просто добавьте переключатель -k.

fuser >/tcp -k 

Пример (порт 8888):

fuser 8888/tcp -k 

Вот и все! Он закроет процесс, прослушивающий порт. Я обычно делаю это перед запуском моего серверного приложения.

Поделиться 08 декабря 2019 в 16:57

  1. Откройте терминал
  2. Запустите следующий код и нажмите Enter

 sudo kill $(sudo lsof -t -i:4200) 

Поделиться 29 августа 2019 в 06:11

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

Событие ‘exit’ испускается при выходе из REPL либо путем получения команды .exit в качестве входного значения, пользователь дважды нажимает -C , чтобы сигнализировать о сигнале, либо путем нажатия -D , чтобы сигнализировать о завершении входного потока. Обратный вызов слушателя вызывается без аргументов.

Таким образом, чтобы суммировать, вы можете выйти:

  1. Ввод .exit в REPL nodejs.
  2. Нажатие -C дважды.
  3. Нажатие -D .
  4. process.exit(0) означает естественный выход из REPL. Если вы хотите вернуть любой другой статус, вы можете вернуть ненулевое число.
  5. process.kill(process.pid) — это способ убить с помощью API nodejs из вашего кода или из REPL.

Поделиться 22 сентября 2016 в 16:41

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

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

Пример:

Установка Forever

npm install forever -g

Запуск сервера Node

forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js

Результат:

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 ~/.forever/forever.log 0:0:0:0.247

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

Поделиться 08 июля 2017 в 18:40

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

require('child_process').exec(`kill -9 $`) 

Поделиться 31 января 2016 в 03:06

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

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

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

Затем я могу убить его, используя:

kill -9 $(ps aux | grep ‘node\ app_name_1/app/server.js’ | awk »)

Это только убивает процесс node, запускаемый app_name_1/app/server.js.

Если вы запустили node app_name_2/app/server.js , этот процесс node продолжит работу.

Если вы решите, что хотите убить их всех, вы можете использовать kill node , как упоминали другие.

Поделиться 06 июля 2017 в 02:51

Поздний ответ, но на Windows, открытие диспетчера задач с помощью CTRL+ALT+DEL, а затем убийство процессов Node.js решит эту ошибку.

Поделиться 20 октября 2018 в 04:32

Для Windows сначала найдите PID с номером вашего порта

netstat -ano | findStr "portNumber" 

enter image description here

После этого убедитесь, что вы находитесь в корне вашего диска «c» И команда будет taskkill /F /PID your pid

Поделиться 12 июня 2019 в 14:35

Если вы используете VS Code и терминал, сначала выберите узел из правой части раскрывающегося списка, а затем выполните Ctrl + C. Тогда это будет работать

enter image description here

Нажмите y, когда вам будет предложено.

enter image description here

Поделиться 11 апреля 2020 в 12:44

Мой случай использования: на MacOS, запуск/перезапуск нескольких серверов узлов на различных портах из скрипта

запуск: «cd $PATH1 && node server1.js & cd $PATH2 && node server2.js &. «

остановка1: «kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk »)»

остановка: «stop1 & stop2 &. & stopN ; запуск

для получения дополнительной информации о поиске процесса по порту: Кто слушает данный TCP-порт на Mac OS X?

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

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