come rilasciare localhost dall'errore: ascolta EADDRINUSE


120

sto testando un server scritto in nodejs su Windows 7 e quando provo a eseguire il tester nella riga di comando ottengo il seguente errore

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

come posso risolverlo senza riavviare?


9
sudo killall nodepuò essere utile
Hashir Hussain

Risposte:


101

Significa che l'indirizzo a cui stai tentando di associare il server è in uso. Prova un'altra porta o chiudi il programma utilizzando quella porta.


Non sono riuscito a trovare nulla utilizzando la porta 3000, ma cambiarlo ha funzionato!
Dennis

7
Poiché questo programma a nodo singolo è l'unica cosa che utilizza la porta 3000 sulla mia macchina, sembra abbastanza chiaro che sia successo qualcosa che ha impedito che la precedente istanza del processo del mio nodo si arrestasse correttamente. Funzionava quando l'ho usato node app.jse l' ho fermato con Ctrl + C, ma ho iniziato ad avere il problema EADDRINUSE dopo la prima volta che l'ho usato npm start, quindi sembra che la vera soluzione sarebbe usare qualcosa di diverso da Ctrl + C per spegnere dopo l'uso npm start.
David Mason

Lo npm startscript potrebbe essere più di un programma nodo o un programma nodo eseguito in background oppure il programma potrebbe avere processi figlio che utilizzano quella porta.
fent

1
Molto spesso, questo errore si verifica perché un processo di nodo non è stato terminato. Ma a volte la porta è utilizzata da altri processi, e quindi potrebbe essere difficile capire / individuare il processo corretto che la blocca. WolfReporter di seguito ha una soluzione corretta a questo problema! stackoverflow.com/a/22875192/36975
qualbeen

6
Ho ps aux | grep nodetrovato l'ID del processo (seconda colonna) e uccidilo semplicemente con kill <pid>(il mio era kill 18762).
nik_m

168

Correre:

ps -ax | grep node

Otterrai qualcosa come:

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

Quindi fa:

kill -9 60778

Grazie! Funziona sulla mia macchina!
olefrank

Grazie. Questo era ciò di cui avevo bisogno. Avevo installato pm2 che avvia automaticamente l'app del nodo quando è chiusa. Ho dovuto disabilitare pm2 per avviare automaticamente il nodo.
KlevisGjN

Lavori! Grazie mille
Wim den Herder,

9
Come lo fai su Windows?
William

kill -15 60778sarebbe molto meglio in quanto consentirebbe al processo di uscire con grazia ( SIGTERM) invece se si invia unSIGKILL
praj

39

Su Linux (almeno derivati ​​di Ubuntu)

killall node

è più facile di questa forma.

ps | grep <something>
kill <somepid>

Né funzionerà se hai un bambino orfano che detiene il porto. Invece, fai questo:

netstat -punta | grep <port>

Se la porta è bloccata vedrai qualcosa del genere:

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

Ora uccidi per pid:

kill -9 <pid>

1
Questo dovrebbe essere contrassegnato come risposta completa. Perché anche nel mio caso si trattava di un bambino orfano. È questo quello che chiamano un processo zombi?
Nithish Inpursuit Ofhappiness

1
Invece del previsto <pid>/<parent>ottengo-
Francisco Corrales Morales

35

Il comando seguente fornirà un elenco dei processi del nodo in esecuzione.

ps | grep node

Per liberare quella porta, interrompere il processo utilizzando quanto segue.

kill <processId>

3
Potresti voler aggiungere un | grep -v grepper escludere il grepprocesso.
Garrett Hyde

6
Come scriveva il poster originale: "su windows 7" ... ;-)
Golo Roden

4
Un'alternativa molto migliore sarebbepidof node
Itay Grudev,

pidofè stato facilmente installato per me su osx con homebrewbrew install pidof
electblake

1
Se si eseguono più applicazioni di nodo, è possibile che l'indirizzo sia associato a un'altra applicazione. Non sarebbe meglio cercare il pid che è associato alla porta su cui stai tentando di avviarti? cioè: per linux potresti usare netstat -lnptu | porta grep #. Non sono sicuro di quale sia l'equivalente per Windows.
chrisst

31

Stai ricevendo l'errore EADDRINUSEperché la porta, che la tua applicazione vuole usare, è occupata da un altro processo. Per rilasciare questa porta, è necessario terminare il processo di occupazione.

Dato che sei su Windows , puoi terminare il processo utilizzando il prompt dei comandi ( cmd). Con ilcmd è possibile scoprire l'ID di processo (PID) dell'applicazione di blocco. Avrai bisogno del PID per terminare / uccidere il processo.

Ecco una guida passo passo ...

  1. Trova tutti i processi in esecuzione su una porta specificata (in questo esempio, la porta è "3000"):

    netstat -ano | trova ": 3000"

  2. Il netstatcomando elencherà tutti i processi in esecuzione sulla porta specificata. Nell'ultima colonna dei netstatrisultati puoi vedere la PIDs (in questo esempio, PID è "8308"). Puoi trovare ulteriori informazioni su uno specifico PIDeseguendo il seguente comando:

    elenco attività / fi "pid eq 8308"

  3. Se vuoi terminare un processo, puoi farlo con il seguente comando usando il suo PID(in questo esempio, PID è "8308"):

    taskkill / pid 8308 / f

Immagine dello schermo

inserisci qui la descrizione dell'immagine


1
solida spiegazione.
Joe Healy

19

Quando ricevi un errore Errore: ascolta EADDRINUSE,

Prova a eseguire i seguenti comandi della shell:

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

Ho grepusato l'8080, perché so che il mio server è in esecuzione sulla porta 8080. ( staticquando lo avvio mi dice: "serving". "Su http://127.0.0.1:8080 '.) Potrebbe essere necessario cercare un altro porta.


1
Alla fine! Una risposta che cerca per porto, invece che per processo. Non è solo il nodo che può legare una porta!
Michael Scheper

Ho prodotto un modulo per rilevare quale processo in esecuzione sta bloccando una porta, chiamato porthog . Fondamentalmente esegue il codice sopra.
Corey

15

supponiamo che il tuo server sia in esecuzione 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)

dopo quell'uso kill -9 <pid>

nel caso precedente sudo kill -9 11716


12

usa il comando seguente per terminare un processo in esecuzione su una determinata porta - 3000 in questo esempio sotto

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

7

Una possibile soluzione che ha funzionato per me è stata semplicemente quella di chiudere la finestra nel browser in cui avevo il corrispondente script " http: // localhost: 3000 / " in esecuzione.


Sì, la finestra del browser ancora aperta è un problema comune con le porte localhost :-)
Dave Everitt

7

Controlla l'ID processo

sudo lsof -i: 8081

Piuttosto che uccidere il particolare processo

sudo kill -9 2925

inserisci qui la descrizione dell'immagine


6

Quando ricevi un errore

Errore: ascolta EADDRINUSE

Apri il prompt dei comandi e digita le seguenti istruzioni:

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

dopo di che riavviare l'interfaccia gap del telefono.

Se vuoi sapere quale processo ID phonegap sta usando, apri TASK MANAGER e guarda l'intestazione della colonna PID e trova il PID n.


Non riuscivo a far funzionare Taskkill, quindi ho aperto Task Manager e aggiunto il PID e l'ho ucciso lì grazie
Tom Stickel

5

Il suddetto killall -9nodo, suggerito da Patrick, funziona come previsto e risolve il problema, ma potresti voler leggere la parte di modifica di questa stessa risposta sul perché kill -9potrebbe non essere il modo migliore per farlo.

Inoltre, potresti voler indirizzare un singolo processo piuttosto che uccidere ciecamente tutti i processi attivi.

In tal caso, prima ottieni l'ID di processo (PID) del processo in esecuzione su quella porta (ad esempio 8888):

lsof -i tcp:8888

Questo restituirà qualcosa di simile:

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

(ASCOLTA) Quindi fai semplicemente (ps - in realtà no. Continua a leggere sotto):

kill -9 57385

4

Funziona su Mac:

Passo 1.

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

Il comando precedente ti fornirà gli ID processo che attualmente detengono la porta.

Passo 2.

Kill -9 <pid>

3

puoi cambiare la tua porta in app.js o nel file di configurazione del tuo progetto.

predefinito ('porta', 80)

e per vedere se la porta 80 è già in uso puoi farlo

netstat -antp | grep 80

netstat -antp | grep node

potresti voler vedere se il processo del nodo è già in esecuzione o meno.

ps -ef | grep node

e se trovi che è già in esecuzione, puoi ucciderlo usando

killall node


1

Ho creato 2 server, in ascolto sulla stessa porta 8081, in esecuzione dallo stesso codice, durante l'apprendimento

La prima creazione del server ha funzionato. La seconda creazione del server non è riuscita con EADDRINUSE

I ritardi di richiamata di node.js potrebbero essere la ragione per cui nessuno dei due ha funzionato, oppure la creazione del secondo server ha avuto un'eccezione e il programma è stato chiuso, quindi anche il primo server è chiuso

2 suggerimento per il problema del server, ho ricevuto da: Come risolvere l'errore: ascolta EADDRINUSE mentre usi nodejs?


1

Errore: ascolta EADDRINUSE per risolverlo in Ubuntu esegui nel terminale netstat -nptl e dopo kill -9 {process-number}questo comando è per uccidere il processo del nodo e ora puoi provare a eseguire di nuovo il comando node server.js

Ex

ascolta 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 ::: * LISTEN 9660 / java

kill -9 10401


2
L'utente ha detto che è su Windows. Su Windows netstatriceve diversi parametri. netstat -a -p tcp -b -vprodurrebbe il nome del processo.
arboreal84

0

Ho il nodo rosso installato sul mio Mac e sul mio Raspberry Pi. Ho avuto lo stesso identico problema e fare "killall" non ha aiutato. Una volta spento il Raspberry Pi e riavviato il computer, ha funzionato bene.


0

Potrebbe essere possibile che tu abbia provato a eseguire il comando npm start in due schede diverse. Non puoi eseguire npm start quando è già in esecuzione in alcune schede. Controllalo una volta.


Si prega di fornire maggiori dettagli.
Desh Deep Singh

0

Per chiunque abbia provato tutto quanto sopra, ma ancora non riesce a trovare il processo rouge, riprovali tutti ma assicurati di includere "sudo" davanti ai comandi.


0

Se ti piace di più l'interfaccia utente, trova il processo Node.js nel task manager di Windows e uccidilo.


0

ps -ef | grep node trova app.js, kill pid di app.js


0

semplicemente uccidi il nodo come nodo pkill -9 nel terminale di ubantu che avvia il nodo


0

Dovrai terminare la porta cercando di utilizzare il seguente comando sul terminale

$ sudo killall -9 nodejs

0

[Risolto]

Potrebbe essere troppo tardi, ma funziona a meraviglia.

Devi pm2essere installato

npm install -g pm2

Per interrompere il server in esecuzione corrente (server.js):

pm2 stop -f server.js

0

Ho risolto questo problema aggiungendo di seguito nel mio package.json per aver ucciso PORT - 4000 attivo (nel mio caso) In esecuzione su WSL2 / Linux / Mac

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

fonte


-1

Per terminare il server del nodo, esegui prima questo comando nel tuo terminale:

  1. top
  2. apri un'altra finestra quindi copia il server iddalla finestra precedente: PID number -9 kill così ora che hai ucciso il server del nodo riprova ad eseguire la tua app.

-1

Ho usato il comando netstat -ano | grep "portnumber"per elencare il numero di porta / PID per quel processo. Quindi, puoi usare taskkill -f //pid 111111per terminare il processo, l'ultimo valore è il pid che trovi dal primo comando.

Un problema in cui mi imbatto a volte è il respawn del nodo anche dopo aver terminato il processo, quindi devo usare il buon vecchio task manager per terminare manualmente il processo del nodo.


-4

Nella finestra, esegui questo comando:

taskkill /F /PID 1952

1
1952 è una variabile. Il processo per uccidere potrebbe avere un ID diverso.
Design di Adrian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.