EADDRINUSE после перезапуска Node.js: кто занял порт
EADDRINUSE при запуске Node.js означает, что запрошенный локальный адрес уже занят другим сервером. Найдите слушающий процесс и механизм, который им управляет, прежде чем его останавливать. После перезапуска причина может быть в старом экземпляре, дублирующем запуске или неверной конфигурации назначения, а не в самом Node.js.
Какую привязку не удалось выполнить
В справочнике ошибок Node.js EADDRINUSE относится к неудачной привязке локального сервера. Сохраните код, операцию, адрес, порт и время ошибки. Номер 3000 часто встречается в примерах, но не является обязательным условием этого отказа.
Отделите эту ситуацию от отказа соединения с удалённым сервисом. Здесь новый сервер не смог занять назначение для своей работы. Изменение DNS сайта или пароля пользователя не объясняет, кто уже использует локальный сокет.
Если приложение сообщает «запущено» до подтверждения слушания, исправьте и наблюдаемость. В документации net.Server событие listening связано с завершившейся привязкой. Запись о начале выполнения программы не равна готовности принимать соединения.
Найдите процесс, затем владельца запуска
На Linux команда просмотра ss -ltnp показывает слушающие TCP-сокеты с числовыми адресами и сведениями о процессах, если они доступны. Её параметры описаны в руководстве ss. Это наблюдение своей системы, а не команда остановки или исправления.
Сопоставьте найденные сведения с ожидаемыми адресом и портом. Затем установите назначение процесса, пользователя запуска и управляющую службу. Если сведений не хватает, попросите уполномоченного администратора дополнить наблюдение. Отсутствие имени процесса в ограниченном выводе не доказывает, что порт свободен.
На другой ОС используйте её средства просмотра слушающих сокетов и процессов. Не переносите Linux-команду как универсальную инструкцию для Windows или macOS. Сам порядок разбора остаётся прежним: назначение, процесс, владелец, основание действия.
Карта конкурирующих запусков
Следующие строки — учебные варианты для разбора, не описание действующего сервера. Таблица нужна, чтобы выбрать адресное исправление и не остановить соседний проект из-за одинакового имени исполняемого файла.
| Предположение | Что подтвердить | Кто управляет | Когда допустима остановка | Что проверить после |
|---|---|---|---|---|
| Остался прежний экземпляр | Версию, назначение и время запуска | Согласованный механизм приложения | Когда подтверждён порядок замены | Новый экземпляр обслуживает нужный маршрут |
| Запуск из терминала дублирует службу | Два источника запуска одного назначения | Администратор службы и оператор | По договору о единственном владельце | Лишний источник больше не стартует |
| Два проекта получили один порт | Конфигурацию обоих назначений | Владельцы проектов | Не требуется останавливать случайный проект | Каждый проект имеет согласованную привязку |
| Процесс появляется снова | Историю запусков и управляющее правило | Менеджер процессов или развёртывание | После согласования с его владельцем | Автоматический запуск не восстанавливает конфликт |
| Проверяется другое окружение | Место выполнения и сетевой контекст | Ответственный за среду | Только после уточнения назначения | Наблюдение относится к нужному экземпляру |
Почему завершение процесса бывает временной победой
Предположим, учебное приложение работает под менеджером процессов, а оператор запускает ещё один экземпляр вручную. Если завершить первый процесс, управляющий механизм может снова его поднять. Тогда конфликт повторится, хотя команда остановки внешне сработала.
В этом сценарии исправляется схема запуска. Договоритесь, кто единолично управляет рабочим экземпляром и как оператор выполняет перезапуск. Не добавляйте третий способ ради того, чтобы второй наконец получил порт.
Не завершайте все процессы Node.js на многопроектной машине. Совпадение исполняемого файла не подтверждает принадлежность к неисправному приложению. Для поддержки сервера подготовьте карту назначения и управляющих механизмов, а не просьбу освободить всё похожее.
Смена порта тоже требует проверки маршрута
Если конфликт вызван ошибкой распределения назначений, новый порт может быть правильным решением. Но его выбирают вместе с конфигурацией прокси, проверками доступности и ожидаемыми клиентами. Успешная привязка к произвольному свободному номеру ещё не возвращает сайт пользователю.
Зафиксируйте, какой адрес должен слушать процесс и кто вправе к нему обращаться. Не расширяйте область доступа случайно ради устранения ошибки. Особенно полезно сохранить это требование в конфигурации развёртывания, чтобы следующий выпуск не вернул старое значение.
Завершение приложения и завершение соединений
Для net.Server документация описывает асинхронный server.close: сервер перестаёт принимать новые соединения, а окончательное закрытие связано с завершением существующих. Это конкретный контракт API. HTTP-сервер и используемый фреймворк нужно проверять по их собственным правилам остановки.
Разработчик должен определить, когда приложение считается завершённым, что происходит с текущими запросами и кто запускает замену. Задержка между командами сама по себе не подтверждает ни освобождение назначения, ни целостность незавершённой работы.
Мы советуем отдельно записывать начало остановки, подтверждённое завершение и готовность нового экземпляра. Это позволит отличить конфликт запусков от долгого завершения. Не выдавайте вывод только об одном этапе за успешный полный перезапуск.
Приёмка следующего запуска
- Сохраните точный адрес, порт, операцию и время EADDRINUSE.
- Найдите слушающий процесс в нужном окружении.
- Подтвердите его назначение и управляющий механизм.
- Устраните дублирование либо согласуйте новую привязку с маршрутами.
- В собственной тестовой среде проверьте штатный останов и новый запуск.
- Подтвердите listening, доступность нужной функции и отсутствие повторного конфликта.
- Закрепите один порядок запуска в инструкции эксплуатации.
Если запуск встроен в веб-приложение, его готовность и завершение входят в требования к поставке. Для доработки эксплуатации передайте таблицу владельцев и наблюдаемую последовательность. Цель — воспроизводимый перезапуск, а не разовое исчезновение EADDRINUSE после случайного завершения процесса.
Вопросы и ответы
Что означает EADDRINUSE в Node.js?
Новый сервер не смог занять локальное назначение, которое уже используется другим сервером. Сохраните адрес и порт, затем найдите фактического владельца.
Нужно ли всегда менять порт 3000 при этой ошибке?
Нет, сначала проверьте, должен ли на этом порту работать найденный процесс. Смена назначения требует согласования с прокси и клиентами, а не только выбора свободного номера.
Почему после остановки Node.js порт снова занят?
Проверьте управляющий механизм и источники повторного запуска. Если процесс восстанавливает служба, исправлять нужно схему управления, а не бесконечно завершать экземпляры вручную.