Węzeł / ekspres: EADDRINUSE, adres już używany - serwer Kill


442

Mam prosty serwer działający w node.js za pomocą connect:

var server = require('connect').createServer();
//actions...
server.listen(3000);

W moim kodzie mam faktyczne programy obsługi, ale taka jest podstawowa idea. Problem, który ciągle dostaję, to

EADDRINUSE, Address already in use

Ten błąd pojawia się przy ponownym uruchomieniu aplikacji po tym, jak wcześniej uległa awarii lub wystąpiła błąd. Ponieważ nie otwieram nowej instancji terminala, zamykam ten proces ctr + z.

Jestem pewien, że wszystko, co muszę zrobić, to zamknąć serwer lub połączenie. Próbowałem nazywając server.close()się process.on('exit', ...);bez powodzenia.


39
Właściwie zamiast tego Ctrl + zpowinieneś użyć, Ctrl + cktóry zamyka program poprawnie, wysyłając SIGQUIT :) Zobacz wiki po dalsze szczegóły :)
nacho4d 14.11.11

1
Masz na myśli SIGINT. SIGQUIT spowodowany jest przez `ctrl + \ '
Xedecimal

53
Spróbuj pkill nodejslub pkill nodejeśli w systemie operacyjnym UNIX
Gerard,

1
Miałem podobny problem i znalazłem ten pakiet, który pozwoli ci czysto wyjść, gdy CTRL + C: npmjs.com/package/exit-hook
Jazzy

1
1. Wygląda na to, że do portu jest zaczepiony zwisający lub martwy identyfikator procesu, więc usługa oparta na węzłach nie uruchamia się i generuje błąd PORT IN USE (ERROR ADDRESS IN USE) 2. Próbujemy dowiedzieć się, jak zwolnić port 10000 bez ponownego uruchamiania serwera.
abksharma

Odpowiedzi:


147

process.on('exit', ..)nie jest wywoływany, jeśli proces ulegnie awarii lub zostanie zabity. Jest wywoływany tylko, gdy kończy się pętla zdarzeń, a ponieważ server.close() niejako kończy się pętla zdarzeń (wciąż musi czekać na aktualnie uruchomione stosy tu i tam), nie ma sensu umieszczać jej wewnątrz zdarzenia wyjścia ...

W razie awarii wykonaj process.on('uncaughtException', ..)i zabijprocess.on('SIGTERM', ..)

To powiedziawszy, SIGTERM (domyślny sygnał zabicia) pozwala aplikacji na czyszczenie, podczas gdy SIGKILL (natychmiastowe zakończenie) nie pozwala aplikacji nic zrobić.


3
przydaje się również przydać
proces.

487

Możesz także przejść do linii poleceń:

ps aux | grep node

aby uzyskać identyfikatory procesu.

Następnie:

kill -9 PID

Wykonanie -9 po zabiciu wysyła SIGKILL (zamiast SIGTERM). SIGTERM był dla mnie czasami ignorowany przez węzeł.


1
ps aux | grep nodenic nie pokazuje; nadal textareaserver --editor-cmd='gvim -f'nie działa: 14 marca 21:19:30 - gotowe gniazdo.io - przyjmowanie połączeń Można teraz uruchomić serwer: EADDRINUSE, adres już używany
Jean Jordaan

75
Dlaczego tak jestkillall -9 node
Martin Josefsson

1
pidofjest również przydatny
JVE999

25
Użyłem tej odpowiedzi przez długi czas, a potem pewnego dnia skomponowałem ją dla wygody dla jednej linijki. To polecenie zabije każdy proces działający na danym porcie (w tym przykładzie 8000): lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
lukejacksonn

1
Miałem jednocześnie wiele serwerów węzłów, niektóre z nich to aplikacje Electron. Musiałem użyć tylko killz konkretnym identyfikatorem procesu zamiast killall.
tuliomir

226

Po pierwsze, chciałbyś wiedzieć, który proces jest używany port 3000

sudo lsof -i :3000

spowoduje to wyświetlenie listy wszystkich nasłuchiwania PID na tym porcie, gdy już będziesz mieć PID , możesz go zakończyć następująco:

kill -9 {PID}

17
To polecenie wyraźnie identyfikuje PID w przeciwieństwie do wyjścia ps aux | grep nodedla mnie. Ja również nie potrzebowałemsudo
Phil Gibbins

To najlepsza odpowiedź. Działa dobrze dla mnie z portem 8081, używając React Native z przędzą.
Fernando Barbosa

To zadziałało dla mnie świetnie. Mogłem zidentyfikować, gdzie był używany port 3000 i tak go zamknąć. Ja też nie potrzebowałem sudo.
Campalo

Bardzo dobrze. Próbowałem też po otrzymaniu polecenia killall -9 {COMMAND}np.killall -9 node
STREET MONEY

wow, zadziałało dla mnie
Anoop PS

162

Uderzyłem to w mojego laptopa z systemem Windows 8. to zadziałało.

Uruchom cmd.exe jako „Administrator”:

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.

Uruchomiłem go z okna poleceń i przypadkowo go zamknąłem. Węzeł nadal działał w tle… (nawet po zakończeniu sesji). W moim przypadku, kiedy zamknąłem kartę przeglądarki, która była do niej podłączona przez gniazda sieciowe, w końcu się zakończyła.
Bertus Kruger

6
taskkill /F /IM node.exedziała jak urok dla mnie w systemie Windows z dowolnego katalogu :-) Dzięki za udostępnienie !!
Marty McGee,

2
Jest to jedyne działające jednoliniowe rozwiązanie, które udało mi się zweryfikować dla systemu Windows
Code Whisperer

4
Działa na systemie Windows 10. Nie musiałem uruchamiać cmd.exe jako admin btw.
Glenn Werner

74

Sprawdź PID, tj. Identyfikator procesu uruchomionego na porcie 3000 za pomocą poniższego polecenia:

lsof -i tcp:3000

Wyprowadziłby coś takiego:

COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)

Teraz zabij proces, używając:

kill -9 5805

to działało dla mnie, gdy korzystam z wtyczki offline SLS.
Junaid Atique

Dzięki za to! Właśnie zacząłem uczyć się reagować, jak kilka godzin temu. :) Po zatrzymaniu serwera uruchomiłem go ponownie, tylko po to, aby napotkać takie błędy.
Glenn

Nie otrzymam wyjścia, jeśli użyję zgubionego. Czy to oznacza, że ​​nie ma procesu z tej strony?
x89

42

Znalazłem to rozwiązanie, spróbuj Daj pozwolenie sudo

  sudo pkill node

Nadal widzę proces węzła za pomocą tego polecenia:ps aux | grep node
IgorGanapolsky

29

Linux

Uruchom psi określ PID procesu swojego węzła.

Następnie uruchomić sudo kill PID

Windows

Użyj listy zadań, aby wyświetlić listę uruchomionych procesów:

tasklist /O

Następnie zabij proces węzła w ten sposób (używając PID uzyskanego z tasklistpolecenia):

taskkill /pid PID

1
A jeśli w systemie Windows?
Trevor,

1
Dla przypomnienia ... z jakiegoś powodu musiałem użyć podwójnych ukośników na moich flagach dla polecenia taskkill z git-bash: taskkill //IM node.exe i właśnie zabiłem node. pracował
nawlbergs

23

Oto jedna linijka (zamień 3000 na port lub zmienną konfiguracyjną):

kill $(lsof -t -i:3000)

20

Otrzymałem ten błąd raz i podjąłem wiele podejść tutaj.

Moje problemy app.listen(3000);polegały na tym, że miałem dwa wywołania w tym samym skrypcie app.js. Pierwszy app.listen () odniósł sukces, gdy drugi zgłosił błąd.

Innym przydatnym poleceniem, które napotkałem, które pomogło mi w debugowaniu, było sudo fuser -k 3000/tcpzabicie wszelkich nieuczciwych procesów, które mogłeś uruchomić (niektóre procesy mogą się zrestartować, np. Jeśli są uruchamiane z plikiem forever.js, ale było to dla mnie przydatne).


ten sam problem tutaj ... dziwne, że poprawnie działał w debugowaniu podczas pobierania tego błędu podczas uruchamianianpm start
Asqan

16

W systemie Windows otwórz Menedżera zadań i znajdź procesy node.exe. Zabij ich wszystkich za pomocą zadania końcowego.

wprowadź opis zdjęcia tutaj


1
takie proste i nieskomplikowane dla użytkowników systemu Windows
momal

To działa. Dzięki
Najathi,

14
ps aux | grep node
kill -9 [PID] (provided by above command)

Opis:


  1. ps poda status procesu, aux poda listę procesów: wszystkich użytkowników, u: własnych procesów użytkownika, x: wszystkich innych procesów niepodłączonych do terminala.
  2. symbol rury: | przekaże wynik ps aux, aby dalej manipulować.
  3. grep przeszuka podany ciąg (w naszym przypadku węzeł) z listy podanej przez ps aux.

12

Do twojej wiadomości, możesz zabić proces jednym poleceniem sudo fuser -k 3000/tcp. Można to zrobić dla wszystkich innych portów, takich jak 8000, 8080 lub 9000, które są powszechnie używane do programowania.



11

Najpierw dowiedz się, co działa, używając:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

Otrzymasz coś takiego:

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

Następnie możesz zabić proces w następujący sposób:

sudo kill 110

Będziesz wtedy mógł uruchomić bez otrzymywania błędów Listen EADDRINUSE ::: 3000


Korzystam z nodemon i ponownie uruchamia usługę. Czy jest jakiś sposób na zabicie nodemona?
Smit Patel

10

Dla Visual Studio Noobs takich jak ja

Być może uruchomiłeś ten proces w innych terminalach!

Po zamknięciu terminala w programie Visual Studio terminal po prostu znika .

I ręcznie stworzony nowy sposób myślenia, że poprzedni został zniszczony. W rzeczywistości za każdym razem, gdy klikałem Nowy terminal, tak naprawdę tworzyłem nowy na podstawie poprzednich .

Więc zlokalizowałem pierwszy terminal i ... Voila, tam uruchomiłem serwer.

wiele terminali bez ponownej analizy


1
O tak, mój bracie.
Jaydeep Shil,

8

Menedżer zadań (ctrl + alt + del) ->

Karta Procesy ->

wybierz proces „node.exe” i kliknij „Zakończ proces”


po co zabijać cały proces węzła, jeśli szukam, to zabić proces portu węzła.
Jimmy Obonyo Abor

8

Możesz natknąć się na scenariusze, w których nawet zabicie wątku lub procesu nie spowoduje zakończenia aplikacji (zdarza mi się to w systemie Linux i Windows co jakiś czas). Czasami może już działać instancja, której nie zamknąłeś.

Z powodu tego rodzaju okoliczności wolę dodać do mojego package.json:

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

Następnie mogę do nich zadzwonić, używając:

npm run stop-win
npm run stop-Linux

Możesz uzyskać bardziej fantazyjne i wykonać te polecenia BIN z flagą argumentu, jeśli chcesz. Możesz także dodać je jako polecenia do wykonania w ramach klauzuli try-catch.


5

W systemie Windows użytkownicy: otwórz task manageri plik, działa dobrze.end tasknodejs.exe


4

Możesz użyć Hot-node, aby zapobiec awariom serwera / błędom w czasie wykonywania. Hot-node automatycznie uruchamia ponownie aplikację nodejs za każdym razem, gdy nastąpi zmiana w programie węzła [source] / process [running program node].

Zainstaluj hot-node używając npm przy użyciu opcji globalnej:

npm install -g hotnode


pm2 to lepszy wybór. bardziej solidny, więcej opcji. i nie ma problemu, gdy działa jako root, który ma na zawsze.
Lucas

@Lucas O czym jest ten główny problem na zawsze, o którym mówisz? Niestety jestem zmuszony używać wiecznie zamiast pm2 na produkcie w pracy (z powodu pewnych bzdur licencyjnych), a to mnie bardzo martwi!
GPX

4

Z należytym szacunkiem do wszystkich odpowiedzi w formularzu chciałbym dodać punkt.

Zauważyłem, że kiedy kończę aplikację węzła po błędzie za pomocą Ctrl + Z, przy następnej próbie jej otwarcia pojawia się ten sam błąd EADDRINUSE.

Kiedy używam Ctrl + C do zakończenia aplikacji węzła, następnym razem ją otworzyłem, nie przeszkadzało.

Zmiana numeru portu na inny niż błędny rozwiązała problem.


1
Ctrl + C jest poprawny. Użyłem tego samego numeru portu co poprzednio i działało jak poprzednio.
vipulnj

2
<key> Ctrl-Z </key> nie zatrzymuje procesu. Umieszcza go w tle, dzięki czemu można uruchamiać inne polecenia. To jest sprawa powłoki uniksowej. Aby kontynuować proces, użyj fgtej samej konsoli. Następnie możesz zobaczyć, co dzieje się na tym serwerze po wpisaniu różnych poleceń w wierszu poleceń.
Alexis Wilke,

4

W systemie Linux.

Dodaj funkcję do ~/.bashrc:

function killTcpListen () {
  kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}

Wyciągnij zmiany: source ~/.bashrc

I użyj tego: killTcpListen 3000


3

Na wszelki wypadek sprawdź, czy dodałeś tę linię wiele razy przez pomyłkę

app.listen(3000, function() {
  console.log('listening on 3000')
});

Powyższy kod ma charakter ekspresowy, ale po prostu sprawdź, czy próbujesz użyć tego samego portu dwa razy w kodzie.


3

Win10, git bash v2.15, węzeł v8.9.1, npm v5.5.1

Miałem skrypt package.json do uruchomienia węzła: "start": "node index.js"

Ilekroć użyłem tego, niezależnie od tego, czy zabiłem go za pomocą Ctrl + C, napotkałem ten problem.

Gdybym tylko pobiegł node index.jsz git bash zamiastnpm run start i zabił z ctrl + c, nigdy nie dostałbym tego błędu.

Nie jestem pewien, dlaczego, ale pomyślałem, że to może komuś pomóc.


1
Otrzymuję ten sam problem z zasadniczo tą samą konfiguracją. w moim przypadku zauważyłem, że uruchomienie aplikacji ekspresowej przez npm spawnuje dwa procesy, ale tylko jeden jest zamknięty przy użyciu ctrl + c. podczas uruchamiania aplikacji z samym węzłem tylko jeden proces jest otwarty i zamyka się poprawnie.
worc,

1
ten problem z git dla systemu Windows rzuca nieco światła na całą sprawę. wygląda na to, że może istnieć jakiś błąd między zależnością mięty a cygwinem.
worc,

3

Rozwiązanie interfejsu użytkownika Dla użytkowników systemu Windows: Odkryłem, że najlepsze odpowiedzi nie działały dla mnie, wydawały się być poleceniami dla użytkowników komputerów Mac lub Linux. Znalazłem proste rozwiązanie, które nie wymagało zapamiętania żadnych poleceń: otwórz Menedżera zadań (ctrl + shift + esc). Spójrz na uruchomione procesy w tle. Znajdź wszystko Node.js i zakończ zadanie.

Po tym, jak to zrobiłem, problem zniknął. Jak stwierdzono w innych odpowiedziach, procesy w tle są nadal uruchomione, ponieważ wcześniej napotkano błąd, a regularne funkcje wyjścia / czyszczenia nie zostały wywołane, więc jednym ze sposobów ich zabicia jest znalezienie procesu w Menedżerze zadań i zabicie go tam . Jeśli uruchomiłeś proces z terminalu / powerShell, zwykle możesz użyć kombinacji klawiszy ctrl + c, aby go zabić.


Tak, właśnie dziękuję za odpowiedź
DINA TAKLIT

3

Przepisując komentarz @ Gerard w mojej odpowiedzi:

Spróbuj pkill nodejslub pkill nodejeśli na systemie UNIX operacyjnym .

To zabije proces uruchamiania serwera węzłów działającego na dowolnym porcie. Pracował dla mnie.

Namaste🙏


2

Węzeł działa gdzieś w pamięci i ma zablokowany ten port. W systemie Windows problem ten, podobnie jak większość problemów z systemem Windows, zostanie rozwiązany poprzez naciśnięcie CTRL+ ALT+ DELi / lub ponowne uruchomienie.


To pytanie odpowiada na wiele innych pytań. Wyłącz i włącz ponownie. Geniusz.
datUser

1

Przyczyny tego problemu są:

  1. Na tym porcie może działać dowolna aplikacja, np. Skype.
  2. Węzeł mógł ulec awarii i port mógł nie zostać zwolniony.
  3. Być może próbowałeś uruchomić serwer więcej niż jeden. Aby rozwiązać ten problem, można zachować wartość logiczną, aby sprawdzić, czy serwer został uruchomiony, czy nie. Powinien zostać uruchomiony tylko wtedy, gdy wartość logiczna zwróci false lub niezdefiniowany;

1

server.close () zajmuje trochę czasu, aby zamknąć połączenie, dlatego powinniśmy uczynić to asynchronicznym wywołaniem jako takim:

await server.close();

WAŻNE: podczas korzystania z funkcji oczekuj musimy użyć słowa kluczowego async w naszej funkcji enkapsulacji jako takiej:

async () => {
  await server.close();
}

1

Użyj poniższej komendy w terminalu / cmd, aby zmienić port (npm run dev jest dla node.js), możesz mieć inne komendy do uruchomienia aplikacji, większość z nich będzie działać podczas zmiany portu, łatwiej i szybciej. Co więcej, możesz użyć dowolnego numeru portu, który jest wolny w twoim systemie zamiast 3002

PORT=3002 npm run dev

W większości przypadków, gdy jeden uruchamia projekt, wychodząc z niego nagle lub nieświadomie, naciska control + z, co daje wyjście z portu, zawsze należy wybierać control + c, który nie wyjdzie z portu, aby uruchomić serwer lub projekt.

Ponadto nadszedł czas, aby zmienić numer portu w kodzie

server.listen(3002);

0

Oznacza to, że masz dwa serwery węzłów działające na tym samym porcie, jeśli jeden działa na porcie, powiedzmy 3000, zmień drugi na inny port, powiedzmy 3001 i wszystko będzie działać dobrze

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.