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?

Adam
źródło
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.

fent
źródło
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
Komposr
źródło
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>
WolfReporter
źródło
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>
wcurtis
źródło
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

Benny Neugebauer
źródło
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.

swathy valluri
źródło
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

Arun Kasyakar
źródło
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)
Atta Ur Rahman
źródło
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 / ”.

iloo
źródło
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

Surender Kumar
źródło
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.

Eshan Chattaraj
źródło
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
Hemant Raghuwanshi
źródło
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>
saran3h
źródło
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

Adeel Ahmad
źródło
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?

Manohar Reddy Poreddy
źródło
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

navnit kapadiya
źródło
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.

alkopop79
źródło
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.

Bhudke Aakshayy
źródło
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”.

MMMTroy
źródło
0

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

polina-c
źródło
0

ps -ef | grep node znajdź app.js, zabij pid z app.js

megan5
źródło
0

po prostu zabij węzeł jako węzeł pkill -9 w terminalu ubantu niż węzeł początkowy

Aditya Prakash
źródło
0

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

$ sudo killall -9 nodejs
Shivam Kohli
źródło
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
dariush fa
źródło
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

zashishz
ź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ę.
Mohammed Dwina
źródło
-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.

davida227
źródło
-4

W oknie wykonaj następujące polecenie:

taskkill /F /PID 1952
Thinhnk
źródło
1
1952 to zmienna. Proces do zabicia może mieć inny identyfikator.
Projekt Adriana,