Почему я постоянно получаю ошибки EADDRINUSE - PullRequest
0 голосов
/ 29 мая 2020

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

Я нахожусь в режиме разработки над проектом Node / React с полным стеком. Мой сервер работает на порту 5000. Мой клиент работает на порту 3000. Я проксирую свои внешние маршруты на узел для фактического ввода-вывода. Кажется, все это работает нормально.

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

На следующий рабочий день я сажусь за работу, вхожу в систему, выполняю npm run dev (я работаю одновременно). Обычно передняя часть подходит без проблем. Однако (даже если приложение работает правильно) моя консоль отображает ERRADDRINUSE ::: 5000.

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

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

Я прав? И, когда вы подтвердите, не могли бы вы включить «почему»? Я все еще учусь, как я go. Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

TL; DR:

Запуск ps aux | grep node позволит вам определить PID процесса, который прослушивает порт 5000, и вы можете убить его с помощью kill -9 PID. (где PID - это идентификатор зависшего процесса)


Еще немного пояснений:

Каждый из ваших двух серверов работает как независимые процессы в вашей системе. Если вы запустите программу командной строки, например top, вы сможете получить список запущенных процессов, включая идентификатор процесса или PID.

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

Обычно процесс завершается, когда выдается сигнал SIGTERM, или принудительно останавливается, когда выдается сигнал SIGKILL.

Однако нередки случаи, когда процесс зависает то и дело. (Я видел это раньше с серверами nodejs). Чтобы остановить их, проще всего было бы вручную отправить процессу сигнал SIGTERM (корректно остановить процесс) или SIGKILL (принудительно остановить процесс).

Команда kill -9 PID может использоваться для подачи сигнала SIGKILL процессу.

Подробнее см. Linux справочные страницы по процессам и / или сигналам.

0 голосов
/ 29 мая 2020

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

...