как освободить localhost от ошибки: слушайте EADDRINUSE


120

Я тестирую сервер, написанный на nodejs в Windows 7, и когда я пытаюсь запустить тестер в командной строке, я получаю следующую ошибку

Error: listen EADDRINUSE
at errnoException (net.js:614:11)
at Array.0 (net.js:704:26)
at EventEmitter._tickCallback (node.js:192:40)

как исправить без перезагрузки?


9
sudo killall nodeможет быть полезно
Хашир Хуссейн

Ответы:


101

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


Я не мог ничего найти, используя порт 3000, но его изменение сработало!
Деннис

7
Поскольку эта программа с одним узлом - единственное, что использует порт 3000 на моей машине, кажется довольно очевидным, что что-то случилось, что помешало правильному завершению предыдущего экземпляра процесса моего узла. Он работал, когда я использовал node app.jsи остановил его с помощью Ctrl + C, но у меня возникла проблема с EADDRINUSE после первого использования npm start, поэтому кажется, что реальным решением было бы использовать что-то другое, кроме Ctrl + C, для выключения после использования npm start.
Дэвид Мейсон

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

1
Очень часто эта ошибка возникает из-за того, что узел-процесс не был завершен. Но иногда порт используется другими процессами, и поэтому может быть трудно понять / найти правильный процесс, блокирующий его. У WolfReporter ниже есть правильное решение этой проблемы! stackoverflow.com/a/22875192/36975
qualbeen

6
Я ps aux | grep nodeнашел идентификатор процесса (второй столбец) и просто убил его kill <pid>(мой был kill 18762).
nik_m 06

168

Бегать:

ps -ax | grep node

Вы получите что-то вроде:

60778 ??         0:00.62 /usr/local/bin/node abc.js

Затем сделайте:

kill -9 60778

Спасибо! Работает на моей машине!
olefrank

Спасибо. Это было то, что мне было нужно. У меня был установлен pm2, который автоматически запускает приложение узла при его закрытии. Мне пришлось отключить pm2 для автозапуска узла.
KlevisGjN

Работает! Большое спасибо
Вим ден Хердер

9
Как это сделать в Windows?
Уильям

kill -15 60778было бы намного лучше, так как это позволило бы процессу SIGTERMSIGKILL
корректно

39

В Linux (по крайней мере, производные Ubuntu)

killall node

проще, чем эта форма.

ps | grep <something>
kill <somepid>

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

netstat -punta | grep <port>

Если порт удерживается, вы увидите что-то вроде этого:

tcp           0      0.0.0.0:<port>          0.0.0.*       LISTEN     <pid>/<parent>

Теперь убиваем по pid:

kill -9 <pid>

1
Это должно быть отмечено как полный ответ. В моем случае это тоже был ребенок-сирота. Это то, что они называют зомби-процессом?
Nithish Inpursuit Ofhappiness

1
Вместо ожидаемого <pid>/<parent>я получаю-
Франсиско Корралес Моралес

35

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

ps | grep node

Чтобы освободить этот порт, остановите процесс, используя следующее.

kill <processId>

3
Вы можете добавить, | grep -v grepчтобы исключить grepпроцесс.
Garrett Hyde

6
Как написано на оригинальном плакате: «на windows 7» ... ;-)
Golo Roden

4
Гораздо лучшая альтернативаpidof node
Итай Грудев

pidofбыл легко установлен для меня на osx с помощью homebrewbrew install pidof
electblake 05

1
Если вы используете больше, чем просто приложения узла, возможно, что адрес привязан к другому приложению. Не лучше было бы поискать pid, привязанный к порту, который вы пытаетесь запустить? т.е. для Linux вы можете использовать netstat -lnptu | grep порт #. Не уверен, что такое эквивалент для окон.
chrisst 03

31

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

Поскольку вы работаете в Windows , вы можете завершить процесс с помощью командной строки ( cmd). С помощью cmdвы можете узнать идентификатор процесса (PID) блокирующего приложения. Вам понадобится PID, чтобы завершить / убить процесс.

Вот пошаговое руководство ...

  1. Найдите все процессы, которые запущены на указанном порту (в этом примере порт "3000"):

    netstat -ano | найти ": 3000"

  2. Команда netstatвыведет список всех процессов, запущенных на указанном порту. В последнем столбце netstatрезультатов вы можете увидеть PIDs (в этом примере PID - «8308»). Вы можете узнать больше о конкретном PID, выполнив следующую команду:

    список задач / fi "pid eq 8308"

  3. Если вы хотите завершить процесс, вы можете сделать это с помощью следующей команды, используя его PID(в этом примере PID - «8308»):

    тасккилл / пид 8308 / ф

Скриншот

введите описание изображения здесь


1
твердое объяснение.
Джо Хили

19

Когда вы получаете сообщение об ошибке Ошибка: слушайте EADDRINUSE,

Попробуйте выполнить следующие команды оболочки:

netstat -a -o | grep 8080
taskkill /F /PID 6204

Я grepвыбрал 8080, потому что знаю, что мой сервер работает на порте 8080. ( staticговорит мне, когда я его запускаю: 'serve "." На http://127.0.0.1:8080 '.) Возможно, вам придется искать другой порт.


1
Наконец! Ответ, который ищет по порту, а не по процессу. Связать порт может не только узел!
Майкл Шепер,

Я создал модуль porthog для определения того, какой из запущенных процессов блокирует порт . Он в основном выполняет приведенный выше код.
Кори

15

предположим, что ваш сервер работает на port 3000

lsof -i tcp:3000
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    node    11716 arun   11u  IPv6 159175      0t0  TCP *:3000 (LISTEN)

после этого использования kill -9 <pid>

в приведенном выше случае sudo kill -9 11716


12

используйте команду ниже, чтобы убить процесс, запущенный на определенном порту - 3000 в этом примере ниже

kill -9 $(lsof -t -i:3000)

7

Одно из возможных решений, которое сработало для меня, заключалось в том, чтобы просто закрыть окно в браузере, в котором у меня был запущен соответствующий скрипт « http: // localhost: 3000 / ».


Да, окно браузера все еще открыто - это обычная проблема с портами localhost :-)
Дэйв Эверитт


6

Когда вы получаете сообщение об ошибке

Ошибка: слушайте EADDRINUSE

Откройте командную строку и введите следующие инструкции:

netstat -a -o | grep 8080
taskkill /F /PID** <*ur Process ID no*>

после этого перезапустите телефонный разрыв интерфейса.

Если вы хотите узнать, какой идентификатор процесса использует телефонный разговор, откройте TASK MANAGER и посмотрите на заголовок столбца PID и найдите PID номер.


Я не мог заставить работать taskkill, поэтому я открыл диспетчер задач, добавил PID и убил его там thx
Tom Stickel

5

Вышеупомянутый killall -9узел, предложенный Патриком, работает так, как ожидалось, и решает проблему, но вы можете прочитать часть редактирования этого самого ответа о том, почемуkill -9 это не лучший способ сделать это.

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

В этом случае сначала получите идентификатор процесса (PID) процесса, запущенного на этом порту (скажем, 8888):

lsof -i tcp:8888

Это вернет что-то вроде:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1

(СЛУШАЙТЕ) Тогда просто сделайте (ps - на самом деле нет. Продолжайте читать ниже):

kill -9 57385

4

Это работает на Mac:

Шаг 1.

sudo lsof -i tcp:3000 (or whatever port you want to kill)

Вышеупомянутая команда предоставит вам идентификаторы процессов, в которых в данный момент находится порт.

Шаг 2.

Kill -9 <pid>

3

вы можете изменить свой порт в app.js или в файле конфигурации проекта ur.

по умолчанию ('порт', 80)

и чтобы узнать, используется ли уже порт 80, вы можете сделать

netstat -antp | grep 80

netstat -antp | узел grep

вы можете захотеть увидеть, запущен ли уже процесс узла или нет.

ps -ef | узел grep

и если вы обнаружите, что он уже запущен, вы можете убить его, используя

узел killall


1

Я создал 2 сервера, прослушивая один и тот же порт 8081, работая с одним и тем же кодом, во время обучения

Создание 1-го сервера сработало, не удалось создать 2-й сервер с EADDRINUSE

Задержки обратного вызова node.js могут быть причиной того, что они не работали, или создание второго сервера имело исключение, и программа завершилась, поэтому 1-й сервер также закрыт

2 подсказка о проблеме с сервером, я получил от: Как исправить ошибку: слушать EADDRINUSE при использовании nodejs?


1

Ошибка: прослушайте EADDRINUSE, чтобы решить ее в Ubuntu, запустите в терминале netstat -nptl и после этогоkill -9 {process-number} эта команда должна убить процесс узла, и теперь вы можете попробовать снова запустить команду node server.js

бывший

слушать EADDRINUSE ::: 8080

netstat -nptl

tcp6 0 0 ::: 9000 ::: * LISTEN 9660 / java
tcp6 0 0 ::: 5800 ::: * LISTEN -
tcp6 0 0 ::: 5900 ::: * LISTEN -
tcp6 0 0 ::: 8080 :: : * LISTEN 10401 / node
tcp6 0 0 ::: 20080 ::: * LISTEN 9660 / java
tcp6 0 0 ::: 80 ::: * LISTEN -
tcp6 0 0 ::: 22 ::: * LISTEN -
tcp6 0 0 ::: 10137 ::: * СЛУШАТЬ 9660 / java

убить -9 10401


2
Пользователь сказал, что это в Windows. В Windows netstatполучает разные параметры. netstat -a -p tcp -b -vвыведет имя процесса.
arboreal84

0

У меня есть красный узел, установленный на моем Mac и моем Raspberry Pi. Была точно такая же проблема, и выполнение killall не помогло. Как только я выключил Raspberry Pi и перезапустил компьютер, он заработал нормально.


0

Возможно, вы пытались запустить команду npm start на двух разных вкладках. Вы не можете запустить команду npm start, если она уже запущена на какой-либо вкладке. Проверьте это один раз.


Пожалуйста, предоставьте более подробную информацию.
DeshDeep Singh

0

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


0

Если вам больше нравится UI, найдите процесс Node.js в диспетчере задач Windows и убейте его.




0

Вам нужно будет убить порт, попытавшись использовать следующую команду на терминале

$ sudo killall -9 nodejs

0

[Решено]

Возможно, уже слишком поздно, но это работает как шарм.

Вам нужно pm2установить

npm install -g pm2

Чтобы остановить текущий работающий сервер (server.js):

pm2 stop -f server.js

0

Я решил эту проблему, добавив ниже в свой package.json для уничтожения активного ПОРТА - 4000 (в моем случае) Работает на WSL2 / Linux / Mac

"scripts": {
    "dev": "nodemon app.js",
    "predev":"fuser -k 4000/tcp && echo 'Terminated' || echo 'Nothing was running on the PORT'",
  }

Источник


-1

Чтобы убить сервер узла, сначала запустите эту команду в своем терминале:

  1. top
  2. откройте другое окно, затем скопируйте сервер idиз предыдущего окна: PID number -9 kill теперь вы убили свой сервер узла, попробуйте еще раз запустить приложение.

-1

Я использовал команду netstat -ano | grep "portnumber", чтобы перечислить номер порта / PID для этого процесса. Затем вы можете использоватьtaskkill -f //pid 111111 чтобы убить процесс, последним значением будет pid, который вы найдете из первой команды.

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


-4

В окне выполните эту команду:

taskkill /F /PID 1952

1
1952 год - переменная. У уничтожаемого процесса может быть другой идентификатор.
Дизайн Адриан,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.