Nodo / Express: EADDRINUSE, indirizzo già in uso - Kill server


443

Ho un semplice server in esecuzione in node.js usando connect:

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

Nel mio codice ho gestori reali, ma questa è l'idea di base. Il problema che continuo a ricevere è

EADDRINUSE, Address already in use

Ricevo questo errore quando eseguo nuovamente la mia applicazione dopo che si è bloccata in precedenza o errori. Dal momento che non sto aprendo una nuova istanza di terminale, chiudo il processo con ctr + z.

Sono abbastanza sicuro che tutto ciò che devo fare è chiudere il server o la connessione. Ho provato a chiamare server.close()in process.on('exit', ...);senza fortuna.


39
In realtà, invece di Ctrl + zte dovresti usare Ctrl + cchi chiuderà correttamente il programma inviando SIGQUIT :) Vedi il wiki per ulteriori dettagli :)
nacho4d

1
Intendi SIGINT. SIGQUIT è dovuto a `ctrl + \`
Xedecimal

53
Prova pkill nodejso pkill nodese su un sistema operativo come UNIX
Gerard,

1
Ho avuto un problema simile e ho trovato questo pacchetto che ti permetterà di uscire in modo pulito quando fai CTRL + C: npmjs.com/package/exit-hook
Jazzy

1
1. Sembra che ci sia un ID processo pendente o morto agganciato alla porta, quindi il servizio Node Based non si avvia e genera l'errore PORT IN USE (INDIRIZZO ERRORE IN USO) 2. Stiamo cercando di scoprire come rilasciare il porta 10000 senza riavviare il server.
abksharma,

Risposte:


147

process.on('exit', ..)non viene chiamato se il processo si arresta in modo anomalo o viene ucciso. Viene chiamato solo quando termina il ciclo degli eventi, e poiché una server.close() sorta di ciclo termina il ciclo degli eventi (deve ancora aspettare che gli stack correntemente vengano eseguiti qui e là) non ha senso inserirlo all'interno dell'evento di uscita ...

In crash, do process.on('uncaughtException', ..)e in kill doprocess.on('SIGTERM', ..)

Detto questo, SIGTERM (segnale di interruzione predefinito) consente di ripulire l'app, mentre SIGKILL (terminazione immediata) non consentirà all'app di fare nulla.


3
è anche utile hook on process.on ('SIGINT', ...)
farincz,

487

Puoi anche seguire il percorso della riga di comando:

ps aux | grep node

per ottenere gli ID di processo.

Poi:

kill -9 PID

Fare il -9 all'uccisione invia un SIGKILL (invece di un SIGTERM). A volte SIGTERM è stato ignorato dal nodo per me.


1
ps aux | grep nodenon mostra nulla; ancora textareaserver --editor-cmd='gvim -f'non riesce: 14 marzo 21:19:30 - socket.io pronto - accettare connessioni Ora è possibile avviare il server: EADDRINUSE, Indirizzo già in uso
Jean Jordaan

75
Perché questo piuttosto chekillall -9 node
Martin Josefsson il

1
pidofè anche utile
JVE999

25
Ho usato questa risposta per molto tempo, poi un giorno l'ho composta in una sola riga per comodità .. questo comando ucciderà qualsiasi processo in esecuzione su una determinata porta (8000 in questo esempio): lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
lukejacksonn

1
Avevo più server di nodo in esecuzione contemporaneamente, alcuni dei quali app Electron. Ho dovuto usare solo killcon l'id specifico del processo anziché killall.
Tuliomir,

230

Innanzitutto, vorrai sapere quale processo sta utilizzando port 3000

sudo lsof -i :3000

questo elencherà tutti i PID in ascolto su questa porta, una volta che hai il PID puoi terminarlo con il seguente:

kill -9 {PID}

17
Questo comando identifica chiaramente il PID a differenza dell'output di ps aux | grep nodeper me. Inoltre non ne avevo bisognosudo
Phil Gibbins il

Questa è la risposta migliore Ha funzionato bene per me con la porta 8081, usando React Native con filato.
Fernando Barbosa,

Questo ha funzionato alla grande per me. Sono riuscito a identificare dove è stata utilizzata la porta 3000 e così vicino. Inoltre non avevo bisogno sudo.
Campalo,

Ottimo. Ho anche provato dopo aver ricevuto il comando, killall -9 {COMMAND}ad esempiokillall -9 node
SOLDI DI STRADA

wow ha funzionato per me
Anoop PS

162

Ho colpito questo sul mio laptop con Win8. questo ha funzionato.

Esegui cmd.exe come 'Amministratore':

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

Lo stavo eseguendo dalla finestra di comando e l'ho chiuso per caso. Il nodo continuava a funzionare nella parte posteriore ... (anche dopo la fine della sessione). Nel mio caso, una volta chiusa la scheda del browser a cui era collegato tramite socket Web, alla fine è stata chiusa.
Bertus Kruger,

6
taskkill /F /IM node.exefunziona come un fascino per me su Windows da qualsiasi directory :-) Grazie per la condivisione !!
Marty McGee,

2
Questa è l'unica soluzione di lavoro a linea singola che sono stato in grado di verificare per Windows
Code Whisperer,

4
Funziona su Windows 10. Non ho dovuto eseguire il cmd.exe come amministratore btw.
Glenn Werner,

74

Controllare il PID, ovvero l'id del processo in esecuzione sulla porta 3000 con il comando seguente:

lsof -i tcp:3000

Produrrà qualcosa di simile al seguente:

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

Ora uccidi il processo usando:

kill -9 5805

questo ha funzionato per me quando si utilizza il plugin offline sls.
Junaid Atique,

Grazie per questo! Ho appena iniziato a imparare a reagire, come ore fa. :) Dopo aver arrestato il server, l'ho eseguito di nuovo, solo per riscontrare tali errori.
Glenn,

Non ottengo alcun output se uso perso. Questo significa che non c'è alcun processo da quella parte?
x89,

42

Ho trovato questa soluzione, provala Concedi l'uso dell'autorizzazione sudo

  sudo pkill node

Vedo ancora il processo del nodo con questo comando:ps aux | grep node
IgorGanapolsky

29

Linux

Esegui pse determina il PID del processo del nodo.

Quindi, corri sudo kill PID

finestre

Utilizzare l'elenco attività per visualizzare l'elenco dei processi in esecuzione:

tasklist /O

Quindi, uccidi il processo del nodo in questo modo (usando il PID ottenuto dal tasklistcomando):

taskkill /pid PID

1
E se su Windows?
Trevor,

1
Proprio come una nota ... per qualche motivo ho dovuto usare doppie barre sulle mie bandiere per il comando taskkill da git-bash: taskkill //IM node.exe e ho appena ucciso il nodo. lavorato.
nawlbergs,

23

Ecco una riga (sostituisci 3000 con una porta o una variabile di configurazione):

kill $(lsof -t -i:3000)

20

Stavo ricevendo questo errore una volta e ho seguito molti degli approcci qui.

Il mio problema era che avevo due app.listen(3000);chiamate nello stesso script app.js. Il primo app.listen () è riuscito dove il secondo ha generato l'errore.

Un altro comando utile che ho trovato che mi ha aiutato a eseguire il debug è stato quello di sudo fuser -k 3000/tcpuccidere tutti i processi non autorizzati che potresti aver avviato (alcuni processi potrebbero riavviarsi, ad esempio se eseguiti con forever.js, ma è stato utile per me).


lo stesso problema qui ... strano che funzionava correttamente nel debug mentre otteneva questo errore per l'esecuzionenpm start
Asqan

16

Per Windows aprire Task Manager e trovare i processi node.exe. Uccidili tutti con End Task.

inserisci qui la descrizione dell'immagine


1
così facile e non complicato per gli utenti di Windows
Momal

Funziona. Grazie
Najathi il

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

Descrizione:


  1. ps fornirà lo stato del processo, aux fornirà l'elenco di a: tutti i processi degli utenti, u: processi propri dell'utente, x: tutti gli altri processi non collegati al terminale.
  2. simbolo del tubo: | passerà il risultato di ps aux per manipolare ulteriormente.
  3. grep cercherà la stringa fornita (nodo nel nostro caso) dall'elenco fornito da ps aux.

12

Cordiali saluti, è possibile interrompere il processo in un solo comando sudo fuser -k 3000/tcp. Questo può essere fatto per tutte le altre porte come 8000, 8080 o 9000 che sono comunemente utilizzate per lo sviluppo.



11

Per prima cosa scopri cosa funziona usando:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

Otterrai qualcosa di simile a:

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)

Quindi puoi terminare il processo come segue:

sudo kill 110

Quindi sarai in grado di eseguire senza ottenere gli errori di ascolto di EADDRINUSE ::: 3000


Sto usando nodemon e riavvia nuovamente il servizio. È il loro modo di uccidere i nodemon?
Smit Patel,

10

Per Visual Studio Noobs come me

È possibile che tu stia eseguendo il processo in altri terminali!

Dopo aver chiuso il terminale in Visual Studio , il terminale scompare .

Ne ho creato manualmente uno nuovo pensando che il precedente fosse stato distrutto. In realtà, ogni volta che facevo clic su Nuovo terminale, in realtà ne creavo uno nuovo in aggiunta a quelli precedenti .

Quindi ho trovato il primo terminale e ... Voila, stavo eseguendo il server lì.

più terminali senza realizzarlo


1
Oh sì mio fratello.
Jaydeep Shil,

8

Task Manager (ctrl + alt + del) ->

Scheda Processi ->

seleziona il processo "node.exe" e premi "Termina processo"


perché uccidere l'intero processo del nodo se ciò che sto cercando è uccidere un processo della porta del nodo.
Jimmy Obonyo Abor,

8

Potresti imbatterti in scenari in cui anche uccidere il thread o il processo in realtà non terminerà l'app (questo succede per me su Linux e Windows una volta ogni tanto). A volte potresti già avere un'istanza in esecuzione che non hai chiuso.

Come risultato di questo tipo di circostanze, preferisco aggiungere al mio package.json:

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

Posso quindi chiamarli usando:

npm run stop-win
npm run stop-Linux

Puoi diventare più elaborato ed eseguire quei comandi BIN con un flag di argomento se vuoi. È inoltre possibile aggiungere quelli come comandi da eseguire all'interno di una clausola try-catch.


5

Negli utenti di Windows: apri task managere end taskil nodejs.exefile, Funziona bene.


4

È possibile utilizzare hot-node per impedire il crash del server / errori di runtime. Hot-node riavvia automaticamente l'applicazione nodejs ogni volta che si verifica una modifica nel programma nodo [sorgente] / processo [programma nodo in esecuzione].

Installa hot-node usando npm usando l'opzione globale:

npm installa -g hotnode


pm2 è una scelta migliore. più robusto, più opzioni. e non ha il problema quando si esegue come root per sempre.
Lucas,

@Lucas Cos'è questo problema alla radice di cui parli per sempre? Sono sfortunatamente costretto a usare per sempre anziché pm2 su un prodotto al lavoro (a causa di qualche schifezza di licenza), e questo mi preoccupa molto!
GPX

4

Nel rispetto di tutte le risposte nel modulo, vorrei aggiungere un punto.

Ho scoperto che quando terminavo un'app nodo in caso di errore usando Ctrl + Z, la volta successiva in cui provavo ad aprirla otteneva lo stesso errore EADDRINUSE.

Quando uso Ctrl + C per terminare un'app nodo, la prossima volta che l'ho aperta, ha funzionato senza intoppi.

La modifica del numero di porta in qualcosa di diverso da quello in errore ha risolto il problema.


1
Ctrl + C è il corretto. Ho usato lo stesso numero di porta di prima e ha funzionato come prima.
Vipulnj,

2
<key> Ctrl-Z </key> non interrompe il processo. Lo mette in background in modo da poter eseguire altri comandi. Questa è una cosa shell Unix. Per continuare il processo, utilizzare fgnella stessa console. Puoi quindi vedere cosa sta succedendo in quel server dopo aver digitato vari comandi nella riga di comando.
Alexis Wilke,

4

Su Linux.

Aggiungi funzione a ~/.bashrc:

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

Tirare le modifiche: source ~/.bashrc

E usalo: killTcpListen 3000


4

Riscrivere il commento di @Gerard nella mia risposta:

Prova pkill nodejso pkill nodese su un sistema operativo simile a UNIX .

Ciò interromperà il processo che esegue il server nodo in esecuzione su qualsiasi porta. Ha funzionato per me.

Namaste🙏


3

Nel caso, controlla se hai aggiunto questa riga più volte per errore

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

Il codice sopra è per express ma controlla solo se stai provando a usare la stessa porta due volte nel tuo codice.


3

Win10, git bash v2.15, nodo v8.9.1, npm v5.5.1

Ho avuto uno script package.json per avviare il nodo: "start": "node index.js"

Ogni volta che l'ho usato, indipendentemente dal fatto che lo avessi ucciso con ctrl + c, ho riscontrato questo problema.

Se ho appena eseguito node index.jsda Git Bash anziché npm run starte ucciso con Ctrl + C, non ho mai avuto questo errore.

Non sono sicuro del perché, ma ho pensato che questo potesse aiutare qualcuno.


1
sto riscontrando lo stesso problema essenzialmente con la stessa configurazione. nel mio caso ho notato che l'esecuzione di un'app express tramite npm genera due processi, ma solo uno viene chiuso quando si utilizza ctrl + c. quando si avvia l'app con un solo nodo, è aperto solo un processo che si chiude correttamente.
worc,

1
questo problema di git per Windows è una specie di fare luce su tutto. sembra che ci potrebbe essere un bug da qualche parte tra la menta e una dipendenza cygwin.
worc,

3

Soluzione di interfaccia utente Per utenti Windows: ho scoperto che le risposte migliori non funzionavano per me, sembravano comandi per utenti Mac o Linux. Ho trovato una soluzione semplice che non richiedeva alcun comando da ricordare: apri Task Manager (ctrl + shift + esc). Guarda i processi in background in esecuzione. Trova qualsiasi Node.js e termina l'attività.

Dopo averlo fatto, il problema è andato via per me. Come indicato in altre risposte, i processi in background sono ancora in esecuzione perché in precedenza si era verificato un errore e non venivano chiamate le normali funzioni di uscita / pulizia, quindi un modo per ucciderli è trovare il processo in Task Manager e ucciderlo lì . Se hai eseguito il processo da un terminale / powerShell di solito puoi usare ctrl + c per ucciderlo.


Sì, proprio grazie per la tua risposta
DINA TAKLIT,

2

Il nodo è in esecuzione da qualche parte nella memoria e ha quella porta bloccata. Su Windows, questo problema si verificherà, come la maggior parte dei problemi di Windows, da risolvere premendo CTRL+ ALT+ DELe / o riavviando.


Questa domanda risponde a tante altre domande. Spegnilo e riaccendilo. Genio.
datUser

1

Le ragioni di questo problema sono:

  1. Qualsiasi applicazione può essere in esecuzione su questa porta come Skype.
  2. Il nodo potrebbe essersi bloccato e la porta potrebbe non essere stata liberata.
  3. Potresti aver provato ad avviare il server più di uno. Per risolvere questo problema, è possibile mantenere un valore booleano per verificare se il server è stato avviato o meno. Dovrebbe essere avviato solo se il valore booleano ritorna falso o indefinito;

1

server.close () impiega un po 'di tempo per chiudere la connessione, quindi dovremmo effettuare una chiamata asincrona come tale:

await server.close();

IMPORTANTE: quando si utilizza waitit , dobbiamo usare la parola chiave asincrona nella nostra funzione incapsulante in quanto tale:

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

1

Usa il comando seguente nel terminale / cmd per cambiare la porta (npm run dev è per node.js) potresti avere altri comandi per eseguire la tua app, la maggior parte funzionerà mentre cambi la porta, più facile e veloce. Inoltre, è possibile utilizzare qualsiasi numero di porta libero nel proprio sistema anziché 3002

PORT=3002 npm run dev

Il più delle volte quando si esegue il progetto mentre si esce improvvisamente o inconsapevolmente si preme control + z che ti dà l'uscita dalla porta sempre andare per control + c che non uscirà dalla porta per eseguire il server o il progetto.

Inoltre, è tempo di cambiare il numero di porta nel tuo codice

server.listen(3002);

0

Questo significa che hai due server di nodo in esecuzione sulla stessa porta, se uno è in esecuzione sulla porta, diciamo 3000, cambia l'altro in un'altra porta, diciamo 3001 e tutto funzionerà bene

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.