jak uwolnić localhost od błędu: słuchaj EADDRINUSE


120

Testuję serwer napisany w nodejs w systemie Windows 7 i kiedy próbuję uruchomić tester w wierszu poleceń, pojawia się następujący błąd

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

jak mogę to naprawić bez ponownego uruchamiania?


9
sudo killall nodemoże się przydać
Hashir Hussain

Odpowiedzi:


101

Oznacza to, że adres, z którym próbujesz powiązać serwer, jest używany. Wypróbuj inny port lub zamknij program korzystający z tego portu.


Nie mogłem znaleźć niczego przy użyciu portu 3000, ale zmiana zadziałała!
Dennis

7
Ponieważ ten program z pojedynczym węzłem jest jedyną rzeczą używającą portu 3000 na moim komputerze, wydaje się całkiem jasne, że stało się coś, co uniemożliwiło prawidłowe zamknięcie poprzedniej instancji mojego procesu węzła. node app.jsDziałało, gdy użyłem i zatrzymałem go za pomocą Ctrl + C, ale zacząłem mieć problem z EADDRINUSE po pierwszym użyciu npm start, więc wydaje się, że prawdziwym rozwiązaniem byłoby użycie czegoś innego niż Ctrl + C do zamknięcia po użyciu npm start.
David Mason

Twój npm startskrypt może być więcej niż jeden program węzeł, węzeł lub program, który jest prowadzony w tle, czy program może mieć procesów potomnych, którzy korzystają z tego portu.
wyprawiony

1
Bardzo często ten błąd występuje, ponieważ proces węzła nie został zakończony. Ale czasami port jest używany przez inne procesy i dlatego zrozumienie / zlokalizowanie prawidłowego procesu blokującego go może być trudne. WolfReporter poniżej ma poprawne rozwiązanie tego problemu! stackoverflow.com/a/22875192/36975
qualbeen

6
Udało mi się ps aux | grep nodeznaleźć identyfikator procesu (druga kolumna) i po prostu go zabić kill <pid>(mój był kill 18762).
nik_m,

168

Biegać:

ps -ax | grep node

Otrzymasz coś takiego:

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

Następnie wykonaj:

kill -9 60778

Dzięki! Działa na mojej maszynie!
olefrank

Dzięki. To było to, czego potrzebowałem. Zainstalowałem pm2, który automatycznie uruchamia aplikację węzła po zamknięciu. Musiałem wyłączyć pm2, aby węzeł autostartu.
KlevisGjN

Pracuje! Wielkie dzięki
Wim den Herder

9
Jak to robisz w systemie Windows?
William,

kill -15 60778byłoby dużo lepsze, ponieważ pozwoliłoby procesowi zakończyć się wdzięcznie ( SIGTERM) zamiast wysyłaniaSIGKILL
praj

39

W systemie Linux (przynajmniej pochodne Ubuntu)

killall node

jest łatwiejsze niż ten formularz.

ps | grep <something>
kill <somepid>

Żadne z nich nie zadziała, jeśli masz osierocone dziecko trzymające port. Zamiast tego zrób to:

netstat -punta | grep <port>

Jeśli port jest przetrzymywany, zobaczysz coś takiego:

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

Teraz zabij przez pid:

kill -9 <pid>

1
Należy to zaznaczyć jako pełną odpowiedź. W moim przypadku też było to dziecko osierocone. Czy to nazywają procesem zombie?
Nithish Inpursuit Ofhappiness

1
Zamiast oczekiwać, <pid>/<parent>otrzymuję-
Francisco Corrales Morales

35

Następujące polecenie wyświetli listę uruchomionych procesów węzłów.

ps | grep node

Aby zwolnić ten port, zatrzymaj proces w następujący sposób.

kill <processId>

3
Możesz chcieć dodać a, | grep -v grepaby wykluczyć grepproces.
Garrett Hyde

6
Jak napisał oryginalny plakat: "on windows 7" ... ;-)
Golo Roden

4
Znacznie lepszą alternatywą byłabypidof node
Itay Grudev

pidofzostał łatwo zainstalowany dla mnie na osx z homebrewbrew install pidof
electblake

1
Jeśli używasz więcej aplikacji niż tylko węzłów, możliwe, że adres jest powiązany z inną aplikacją. Czy nie byłoby lepiej poszukać pid, który jest powiązany z portem, na którym próbujesz uruchomić? czyli: dla Linuksa możesz użyć netstat -lnptu | grep port #. Nie jestem pewien, jaki jest odpowiednik dla systemu Windows.
chrisst,

31

Otrzymujesz błąd, EADDRINUSEponieważ port, którego chce używać Twoja aplikacja, jest zajęty przez inny proces. Aby zwolnić ten port, musisz zakończyć proces zajmowania.

Ponieważ jesteś w systemie Windows , możesz zakończyć proces za pomocą wiersza polecenia ( cmd). Za pomocą cmdmożna odkryć identyfikator procesu (PID) aplikacji blokującej. Będziesz potrzebował PID, aby zakończyć / zabić proces.

Oto przewodnik krok po kroku ...

  1. Znajdź wszystkie procesy uruchomione na określonym porcie (w tym przykładzie Port to „3000”):

    netstat -ano | znajdź „: 3000”

  2. netstatKomenda wyświetli się wszystkie procesy uruchomione na określonym porcie. W ostatniej kolumnie netstatwyników można zobaczyć PIDs (w tym przykładzie PID to „8308”). Możesz dowiedzieć się więcej o konkretnym PID, uruchamiając następujące polecenie:

    lista zadań / fi „pid eq 8308”

  3. Jeśli chcesz zakończyć proces, możesz to zrobić za pomocą następującego polecenia, używając jego PID(w tym przykładzie PID to „8308”):

    taskkill / pid 8308 / f

Zrzut ekranu

wprowadź opis obrazu tutaj


1
solidne wyjaśnienie.
Joe Healy,

19

Gdy pojawi się błąd Error: posłuchaj EADDRINUSE,

Spróbuj uruchomić następujące polecenia powłoki:

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

Wydałem grepdla 8080, ponieważ wiem, że mój serwer działa na porcie 8080. ( staticmówi mi, kiedy go uruchamiam: „obsługa”. ” Pod adresem http://127.0.0.1:8080 '.) Być może będziesz musiał poszukać innego Port.


1
W końcu! Odpowiedź, która wyszukuje według portu, a nie procesu. Nie tylko węzeł może powiązać port!
Michael Scheper,

Stworzyłem moduł do wykrywania, który działający proces blokuje port, o nazwie porthog . Zasadniczo wykonuje powyższy kod.
Corey

15

załóżmy, że twój serwer działa 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)

po tym użyciu kill -9 <pid>

w powyższym przypadku sudo kill -9 11716


12

użyj poniższego polecenia, aby zabić proces działający na określonym porcie - 3000 w tym przykładzie poniżej

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

7

Jednym z możliwych rozwiązań, które zadziałało, było po prostu zamknięcie okna przeglądarki, w której był uruchomiony odpowiedni skrypt „ http: // localhost: 3000 / ”.


Tak, okno przeglądarki wciąż otwarte to częsty problem z portami hosta lokalnego :-)
Dave Everitt

7

Sprawdź identyfikator procesu

sudo lsof -i: 8081

Niż zabij konkretny proces

sudo kill -9 2925

wprowadź opis obrazu tutaj


6

Kiedy pojawi się błąd

Błąd: słuchaj EADDRINUSE

Otwórz wiersz polecenia i wpisz następujące instrukcje:

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

po tym zrestartuj interfejs przerwy telefonicznej.

Jeśli chcesz wiedzieć, którego identyfikatora procesu używa phonegap, otwórz TASK MANAGER i spójrz na nagłówek kolumny PID i znajdź numer PID.


Nie mogłem dostać taskkill do pracy, więc otworzyłem menedżer zadań i dodał PID i zabił go tam thx
Tom Stickel

5

Wspomniany killall -9węzeł, zasugerowany przez Patricka, działa zgodnie z oczekiwaniami i rozwiązuje problem, ale możesz przeczytać część edytującą tej właśnie odpowiedzi, dlaczegokill -9 nie jest to najlepszy sposób zrobienia tego.

Ponadto możesz chcieć skupić się na pojedynczym procesie, zamiast ślepo zabijać wszystkie aktywne procesy.

W takim przypadku najpierw pobierz identyfikator procesu (PID) procesu działającego na tym porcie (powiedzmy 8888):

lsof -i tcp:8888

To zwróci coś takiego:

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

(SŁUCHAJ) Następnie po prostu zrób (ps - właściwie nie. Czytaj dalej):

kill -9 57385

4

Działa to na komputerach Mac:

Krok 1.

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

Powyższe polecenie poda identyfikator (y) procesów aktualnie utrzymujących port.

Krok 2.

Kill -9 <pid>

3

możesz zmienić swój port w app.js lub w pliku konfiguracyjnym projektu ur.

domyślny ('port', 80)

i sprawdzić, czy port 80 jest już używany, możesz to zrobić

netstat -antp | grep 80

netstat -antp | grep node

możesz chcieć sprawdzić, czy proces węzła już działa, czy nie.

ps -ef | grep node

a jeśli okaże się, że już działa, możesz go zabić za pomocą

killall node


1

Stworzyłem 2 serwery nasłuchujące na tym samym porcie 8081, działające z tego samego kodu podczas nauki

Tworzenie pierwszego serwera nie powiodło się. Tworzenie drugiego serwera nie powiodło się z EADDRINUSE

Opóźnienia wywołań zwrotnych node.js mogą być przyczyną braku działania, lub utworzenie drugiego serwera miało wyjątek i program został zamknięty, więc pierwszy serwer jest również zamknięty

2 podpowiedź dotycząca problemu z serwerem, otrzymałem od: Jak naprawić błąd: słuchaj EADDRINUSE podczas korzystania z nodejs?


1

Błąd: posłuchaj EADDRINUSE, aby rozwiązać go w Ubuntu, uruchom w terminalu netstat -nptl i po tymkill -9 {process-number} poleceniu to zabije proces węzła, a teraz możesz spróbować ponownie uruchomić polecenie node server.js

Dawny

posłuchaj EADDRINUSE ::: 8080

netstat -nptl

tcp6 0 0 ::: 9000 ::: *
SŁUCHAJ 9660 / java tcp6 0 0 ::: 5800 ::: *
SŁUCHAJ - tcp6 0 0 ::: 5900 ::: *
SŁUCHAJ - tcp6 0 0 ::: 8080 :: : *
SŁUCHAJ 10401 / węzeł tcp6 0 0 ::: 20080 ::: *
SŁUCHAJ 9660 / java tcp6 0 0 ::: 80 ::: *
SŁUCHAJ - tcp6 0 0 ::: 22 ::: *
SŁUCHAJ - tcp6 0 0 ::: 10137 ::: * SŁUCHAJ 9660 / java

zabić -9 10401


2
Użytkownik powiedział, że jest w systemie Windows. W systemie Windows netstatotrzymuje różne parametry. netstat -a -p tcp -b -vwyświetli nazwę procesu.
arboreal84

0

Mam zainstalowany węzeł Node Red na moim Macu i moim Raspberry Pi. Miałem dokładnie ten sam problem i wykonanie „killall” nie pomogło. Po zamknięciu Raspberry Pi i ponownym uruchomieniu komputera wszystko działało dobrze.


0

Może się zdarzyć, że próbowałeś uruchomić komendę npm start na dwóch różnych kartach. Nie możesz uruchomić komendy npm start, gdy jest już uruchomiona na jakiejś karcie. Zaznacz to raz.


Podaj więcej szczegółów.
DeshDeep Singh

0

Każdy, kto wypróbował wszystkie powyższe rozwiązania, ale nadal nie może znaleźć procesu rouge, powinien spróbować wszystkich ponownie, ale upewnij się, że przed poleceniami znajduje się słowo „sudo”.


0

Jeśli bardziej podoba Ci się interfejs użytkownika, znajdź proces Node.js w menedżerze zadań systemu Windows i zabij go.




0

Będziesz musiał zabić port, próbując użyć następującego polecenia na terminalu

$ sudo killall -9 nodejs

0

[ROZWIĄZANY]

Może jest już za późno, ale działa jak urok.

Musisz pm2być zainstalowany

npm install -g pm2

Aby zatrzymać aktualnie działający serwer (server.js):

pm2 stop -f server.js

0

Rozwiązałem ten problem, dodając poniżej w moim package.json dla zabicia aktywnego PORT - 4000 (w moim przypadku) Działa na WSL2 / Linux / Mac

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

Źródło


-1

Aby zabić serwer węzłów, najpierw uruchom to polecenie w terminalu:

  1. top
  2. otwórz kolejne okno, a następnie skopiuj serwer idz poprzedniego okna: PID number -9 kill więc teraz zabiłeś serwer węzła, spróbuj ponownie uruchomić aplikację.

-1

Użyłem polecenia netstat -ano | grep "portnumber", aby wyświetlić numer portu / PID dla tego procesu. Następnie możesz użyć taskkill -f //pid 111111do zabicia procesu, ostatnią wartością jest pid znaleziony w pierwszym poleceniu.

Czasami napotykam problem odradzania się węzła nawet po zabiciu procesu, więc muszę użyć starego dobrego menedżera zadań, aby ręcznie zabić proces węzła.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.