як звільнити 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

168

Виконати:

ps -ax | grep node

Ви отримаєте щось на кшталт:

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

Потім зробіть:

kill -9 60778

Дякую! Працює на моїй машині!
олефранк

Дякую. Це було те, що мені було потрібно. У мене був встановлений pm2, який автоматично запускає додаток вузла, коли його закрито. Мені довелося відключити pm2 для автоматичного запуску вузла.
KlevisGjN

Працює! Велике спасибі
Wim den Herder

9
Як це зробити в Windows?
Вільям

kill -15 60778було б набагато краще, оскільки це дозволило б процесу вийти граціозно ( SIGTERM), натомість, якщо надсилатиSIGKILL
praj

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 Of Щастя

1
Замість очікуваного <pid>/<parent>я отримаю-
Франциско Корралес Моралес

35

Наступна команда надасть вам список запущених процесів вузлів.

ps | grep node

Щоб звільнити цей порт, зупиніть процес, використовуючи наступне.

kill <processId>

3
Ви можете додати a | grep -v grepдля виключення grepпроцесу.
Гаррет Гайд

6
Як писав оригінальний плакат: "на windows 7" ... ;-)
Голо Роден

4
Набагато кращою альтернативою будеpidof node
Ітай Грудев,

pidofбув легко встановлений для мене на osx з homebrewbrew install pidof
electblake

1
Якщо ви запускаєте більше, ніж просто програми з вузлами, можливо, адреса пов'язана з якоюсь іншою програмою. Чи не було б краще шукати pid, який прив’язаний до порту, який ви намагаєтеся запустити? тобто для Linux ви можете використовувати netstat -lnptu | греп порт #. Не впевнений, що таке еквівалент для Windows.
chrisst

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"):

    taskkill / pid 8308 / f

Знімок екрана

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


1
ґрунтовне пояснення.
Джо Хілі

19

Коли ви отримуєте помилку Помилка: слухайте EADDRINUSE,

Спробуйте виконати такі команди оболонки:

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

Я grepОД на 8080, тому що я знаю , що мій сервер працює на порту 8080. ( staticговорить мені , коли я починаю його: "виступає в" " 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*>

після цього перезавантажте інтерфейс розриву телефону.

Якщо ви хочете дізнатись, який фонегап ідентифікатора процесу використовується, відкрийте МЕНЕДЖЕР ЗАВДАННЯ та подивіться на заголовок стовпця PID та знайдіть номер PID.


Мені не вдалося змусити роботу працювати, тому я відкрив диспетчера завдань і додав 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

(LISTEN) Тоді просто зробіть (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 або у файлі конфігурації ур-проекту.

за замовчуванням ('порт', 80)

і побачити, чи вже використовується порт 80, ви можете зробити

netstat -antp | grep 80

netstat -antp | grep-вузол

ви можете бачити, чи вже запущений процес вузла чи ні.

ps -ef | греп-вузол

і якщо ви знайдете його вже запущеним, ви можете вбити його за допомогою

кілловий вузол


1

Я створив 2 сервери, слухаючи на тому ж порту 8081, працюючи з того самого коду, навчаючись

1-й сервер створення шуду працював, 2-е створення сервера не вдалося за допомогою EADDRINUSE

Затримка зворотного виклику node.js може бути причиною того, що не працювало, або створення 2-го сервера мало виняток, і програма вийшла, тому 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 / вузол
tcp6 0 0 ::: 20080 ::: * LISTEN 9660 / java
tcp6 0 0 ::: 80 ::: * LISTEN -
tcp6 0 0 ::: 22 ::: * LISTEN -
tcp6 0 0 ::: 10137 ::: * LISTEN 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 Сінгх

0

Кожному, хто випробував усе вищезазначене, але все ще не може знайти процес маршрутизації, спробуйте їх ще раз, але переконайтеся, що ви включили "sudo" перед командами.


0

Якщо вам більше подобається інтерфейс користувача, знайдіть процес Node.js у менеджері завдань Windows та вбийте його.




0

Вам потрібно буде вбити порт, намагаючись використовувати наступну команду на терміналі

$ sudo killall -9 nodejs

0

[РІШЕНО]

Це може бути пізно, але це працює як принадність.

Вам потрібно pm2встановити

npm install -g pm2

Щоб зупинити поточний запущений сервер (server.js):

pm2 stop -f server.js

0

Я вирішив цю проблему, додавши нижче в мій пакунок.json за вбивство активного PORT - 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 для вбивства процесу, останнє значення - це номер, який ви знайдете з першої команди.

Однією з проблем, з якою я стикаюся часом, є перезапуск вузла навіть після вбивства процесу, тому я маю використовувати старий хороший менеджер завдань, щоб вручну вбити процес вузла.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.