Node / Express: EADDRINUSE, Adresse déjà utilisée - Kill server

444

J'ai un serveur simple fonctionnant dans node.js utilisant connect:

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

Dans mon code, j'ai des gestionnaires réels, mais c'est l'idée de base. Le problème que je reçois est

EADDRINUSE, Address already in use

Je reçois cette erreur lorsque j'exécute à nouveau mon application après une panne ou des erreurs. Comme je n'ouvre pas une nouvelle instance de terminal, je termine le processus avecctr + z .

Je suis pratiquement certain que tout ce que j'ai à faire est de fermer le serveur ou la connexion. J'ai essayé d' appeler server.close()à process.on('exit', ...);pas de chance.

Skawful
la source
39
En fait, au lieu de Ctrl + zvous devez utiliser Ctrl + cce qui fermera le programme correctement en envoyant SIGQUIT :) Voir le wiki pour plus de détails :)
nacho4d
1
Vous voulez dire SIGINT. SIGQUIT est dû à `ctrl + \`
Xedecimal
53
Essayez pkill nodejsou pkill nodesi sur un système d'exploitation de type UNIX
Gerard
1
J'ai eu un problème similaire et j'ai trouvé ce package qui vous permettra de quitter proprement lorsque vous CTRL + C: npmjs.com/package/exit-hook
Jazzy
1
1. Il semble qu'il y ait un ID de processus suspendu ou mort verrouillé sur le port, donc le service basé sur les nœuds ne démarre pas et ne génère pas d'erreur PORT IN USE (ERROR ADDRESS IN USE) 2. Nous essayons de savoir comment libérer le port 10000 sans redémarrer le serveur.
abksharma

Réponses:

147

process.on('exit', ..)n'est pas appelé si le processus se bloque ou est tué. Il n'est appelé que lorsque la boucle d'événement se termine, et comme en server.close() quelque sorte, la boucle d'événement se termine (il doit encore attendre les piles en cours d'exécution ici et là), cela n'a aucun sens de le mettre à l'intérieur de l'événement de sortie ...

En cas d'accident, faites process.on('uncaughtException', ..) et tuezprocess.on('SIGTERM', ..)

Cela étant dit, SIGTERM (signal de suppression par défaut) permet à l'application de nettoyer, tandis que SIGKILL (arrêt immédiat) ne laisse rien faire à l'application.

Tor Valamo
la source
3
c'est aussi un crochet utile sur process.on ('SIGINT', ...)
farincz
489

Vous pouvez également suivre l'itinéraire en ligne de commande:

ps aux | grep node

pour obtenir les identifiants de processus.

Alors:

kill -9 PID

Faire le -9 sur kill envoie un SIGKILL (au lieu d'un SIGTERM). SIGTERM a été ignoré par nœud pour moi parfois.

djburdick
la source
1
ps aux | grep nodene montre rien; textareaserver --editor-cmd='gvim -f'échoue toujours : 14 mars 21:19:30 - socket.io prêt - acceptation des connexions Pourrait maintenant démarrer le serveur: EADDRINUSE, Adresse déjà utilisée
Jean Jordaan
75
Pourquoi cela plutôt quekillall -9 node
Martin Josefsson
1
pidofest aussi pratique
JVE999
25
J'ai utilisé cette réponse pendant longtemps, puis un jour, je l'ai composée dans une seule ligne pour plus de commodité .. cette commande tuera tout processus en cours d'exécution sur un port donné (8000 dans cet exemple): lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
lukejacksonn
1
J'avais plusieurs serveurs de nœuds fonctionnant à la fois, certains d'entre eux des applications Electron. J'ai dû utiliser uniquement killavec l'ID de processus spécifique au lieu de killall.
tuliomir
231

Tout d'abord, vous voudriez savoir quel processus utilise port 3000

sudo lsof -i :3000

cela répertoriera tous les PID écoutant sur ce port, une fois que vous avez le PID, vous pouvez le terminer avec les éléments suivants:

kill -9 {PID}
Mina Gabriel
la source
17
Cette commande identifie clairement le PID contrairement à la sortie de ps aux | grep nodepour moi. Je n'avais pas non plus besoinsudo
Phil Gibbins
C'est la meilleure réponse. Fonctionné très bien pour moi avec le port 8081, en utilisant React Native avec du fil.
Fernando Barbosa
Cela a très bien fonctionné pour moi. J'ai pu identifier où le port 3000 était utilisé et ainsi le fermer. Je n'avais pas non plus besoin sudo.
Campalo
Très bien. J'ai également essayé après avoir obtenu la commande, killall -9 {COMMAND}par exemplekillall -9 node
STREET MONEY
wow cela a fonctionné pour moi
Anoop PS
162

Je l'ai frappé sur mon ordinateur portable exécutant win8. cela a fonctionné.

Exécutez cmd.exe en tant qu'administrateur:

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.
Sushil
la source
Je l'exécutais depuis la fenêtre de commande et je l'ai fermé par accident. Le nœud continuait de fonctionner à l'arrière-plan ... (même après la fin de la session). Dans mon cas, une fois que j'ai fermé l'onglet du navigateur qui lui était connecté via des sockets Web, il s'est finalement arrêté.
Bertus Kruger
6
taskkill /F /IM node.exefonctionne comme un charme pour moi sur Windows à partir de n'importe quel répertoire :-) Merci pour le partage !!
Marty McGee
2
Ceci est la seule solution de travail sur une seule ligne que j'ai pu vérifier pour Windows
Code Whisperer
4
Fonctionne sur Windows 10. Je n'ai pas eu à exécuter le cmd.exe en tant qu'administrateur btw.
Glenn Werner
74

Vérifiez le PID, c'est-à-dire l'ID du processus exécuté sur le port 3000 avec la commande ci-dessous:

lsof -i tcp:3000

Cela produirait quelque chose comme ceci:

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

Maintenant, tuez le processus en utilisant:

kill -9 5805
Ayan
la source
cela a fonctionné pour moi lors de l'utilisation du plugin sls hors ligne.
Junaid Atique
Merci pour cela! J'ai juste commencé à apprendre à réagir, il y a des heures. :) Après avoir arrêté le serveur, je l'ai relancé, seulement pour rencontrer de telles erreurs.
Glenn
Je n'obtiens aucune sortie si j'utilise perdu. Est-ce à dire qu'il n'y a pas de processus de cette part?
x89
42

J'ai trouvé cette solution, essayez-la Donnez l'autorisation d'utiliser sudo

  sudo pkill node
alicanozkara
la source
Je vois toujours le processus de noeud avec cette commande:ps aux | grep node
IgorGanapolsky
29

Linux

Exécutez pset déterminez le PID de votre processus de nœud.

Ensuite, exécutez sudo kill PID

les fenêtres

Utilisez la liste des tâches pour afficher la liste des processus en cours d'exécution:

tasklist /O

Ensuite, tuez le processus de nœud comme ceci (en utilisant le PID obtenu à partir de la tasklistcommande):

taskkill /pid PID
Shripad Krishna
la source
1
Et si sous Windows?
Trevor
1
Juste une note ... pour une raison quelconque, j'ai dû utiliser des doubles barres obliques sur mes drapeaux pour la commande taskkill de git-bash: taskkill //IM node.exe et je viens de tuer le nœud. travaillé.
nawlbergs
23

Voici un one liner (remplacez 3000 par un port ou une variable de configuration):

kill $(lsof -t -i:3000)
floribon
la source
20

J'obtenais cette erreur une fois et j'ai adopté de nombreuses approches ici.

Mon problème était que j'avais deux app.listen(3000);appels dans le même script app.js. Le premier app.listen () a réussi là où le second a jeté l'erreur.

Une autre commande utile que j'ai rencontrée qui m'a aidé à déboguer était de sudo fuser -k 3000/tcptuer tous les processus voyous que vous pourriez avoir démarrés (certains processus peuvent redémarrer, par exemple s'ils sont exécutés avec forever.js, mais cela m'a été utile).

Trousse
la source
le même problème ici ... bizarre qu'il fonctionnait correctement dans le débogage lors de l'obtention de cette erreur pour l'exécutionnpm start
Asqan
16

Pour Windows, ouvrez le Gestionnaire des tâches et recherchez les processus node.exe. Tuez-les tous avec Fin de tâche.

entrez la description de l'image ici

Shahdat
la source
1
si facile et non compliqué pour les utilisateurs de Windows
momal
Ça marche. Merci
Najathi
14
ps aux | grep node
kill -9 [PID] (provided by above command)

La description:


  1. ps donnera l'état du processus, aux fournira la liste de a: tous les processus utilisateurs, u: processus propres à l'utilisateur, x: tous les autres processus non attachés au terminal.
  2. symbole de tuyau: | passera le résultat de ps aux à manipuler davantage.
  3. grep recherchera la chaîne fournie (nœud dans notre cas) dans la liste fournie par ps aux.
Daniyal
la source
12

Pour info, vous pouvez tuer le processus en une seule commande sudo fuser -k 3000/tcp. Cela peut être fait pour tous les autres ports comme 8000, 8080 ou 9000 qui sont couramment utilisés pour le développement.

Dat TT
la source
12

Utilisateurs PowerShell:

Taskkill / IM node.exe / F

var foobar
la source
11

Découvrez d'abord ce qui fonctionne en utilisant:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

Vous obtiendrez quelque chose comme:

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)

Ensuite, vous pouvez tuer le processus comme suit:

sudo kill 110

Ensuite, vous pourrez exécuter sans obtenir les erreurs listen EADDRINUSE ::: 3000

raison
la source
J'utilise nodemon et il redémarre le service. Est-ce leur moyen de tuer nodemon?
Smit Patel
10

Pour Visual Studio Noobs comme moi

Vous exécutez peut-être le processus dans d'autres terminaux!

Après avoir fermé le terminal dans Visual Studio , le terminal disparaît simplement .

J'en ai créé manuellement un nouveau en pensant que le précédent avait été détruit. En réalité, chaque fois que je cliquais sur Nouveau terminal, j'en créais un nouveau en plus des précédents .

J'ai donc localisé le premier terminal et ... Voila, j'y dirigeais le serveur.

plusieurs terminaux sans le réaliser

jmrueda
la source
1
Oh ouais mon frère.
Jaydeep Shil
8

Gestionnaire des tâches (ctrl + alt + del) ->

Onglet Processus ->

sélectionnez le processus "node.exe" et cliquez sur "Terminer le processus"

idanuda
la source
pourquoi tuer le processus de noeud entier si ce que je cherche est de tuer un processus de port de noeud.
Jimmy Obonyo Abor
8

Vous pouvez rencontrer des scénarios où même tuer le fil ou le processus ne mettra pas fin à l'application (cela se produit pour moi sous Linux et Windows de temps en temps). Parfois, vous pouvez déjà avoir une instance en cours d'exécution que vous n'avez pas fermée.

En raison de ce genre de circonstances, je préfère ajouter à mon package.json:

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

Je peux ensuite les appeler en utilisant:

npm run stop-win
npm run stop-Linux

Vous pouvez devenir plus sophistiqué et créer ces commandes BIN avec un indicateur d'argument si vous le souhaitez. Vous pouvez également les ajouter en tant que commandes à exécuter dans une clause try-catch.

Adam Gerard
la source
5

Dans les utilisateurs de Windows: ouvrez task manageret end taskle nodejs.exefichier, cela fonctionne bien.

Najathi
la source
4

Vous pouvez utiliser hot-node pour empêcher votre serveur de planter / erreurs d'exécution. Hot-node redémarre automatiquement l'application nodejs pour vous chaque fois qu'il y a un changement dans le programme de noeud [source] / processus [programme de noeud en cours d'exécution].

Installez hot-node en utilisant npm en utilisant l'option globale:

npm install -g hotnode

pierre de touche
la source
pm2 est un meilleur choix. plus robuste, plus d'options. et n'a pas le problème lors de l'exécution en tant que root qui a toujours.
Lucas
@Lucas Quel est ce problème racine depuis toujours dont vous parlez? Je suis malheureusement obligé d'utiliser pour toujours au lieu de pm2 sur un produit au travail (à cause de quelques conneries de licence), et cela m'inquiète beaucoup!
GPX
4

Avec tout le respect que je dois à toutes les réponses du formulaire, je voudrais ajouter un point.

J'ai constaté que lorsque je ferme une application de nœud par erreur à l'aide de Ctrl + Z, la toute prochaine fois que j'essaie de l'ouvrir a la même erreur EADDRINUSE.

Lorsque j'utilise Ctrl + C pour terminer une application de nœud, la prochaine fois que je l'ouvrais, cela se faisait sans accroc.

Le fait de changer le numéro de port pour autre chose que celui par erreur a résolu le problème.

Amal Augustine Jose
la source
1
Ctrl + C est le bon. J'ai utilisé le même numéro de port qu'avant et cela a fonctionné comme avant.
vipulnj
2
<key> Ctrl-Z </key> n'arrête pas le processus. Il le met en arrière-plan pour que vous puissiez exécuter d'autres commandes. C'est une chose shell Unix. Pour continuer le processus, utilisez fgcette même console. Vous pouvez ensuite voir ce qui se passe sur ce serveur après avoir tapé diverses commandes dans la ligne de commande.
Alexis Wilke
4

Sous Linux.

Ajouter une fonction à ~/.bashrc:

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

Tirez les modifications: source ~/.bashrc

Et utilisez-le: killTcpListen 3000

rofrol
la source
4

Réécriture du commentaire de @Gerard dans ma réponse:

Essayez pkill nodejsou pkill nodesi sur un système d' exploitation de type UNIX.

Cela tuera le processus exécutant le serveur de noeud exécuté sur n'importe quel port. A travaillé pour moi.

Namaste🙏

Génie
la source
3

Juste au cas où vérifiez si vous avez ajouté cette ligne plusieurs fois par erreur

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

Le code ci-dessus est pour express mais vérifiez simplement si vous essayez d'utiliser le même port deux fois dans votre code.

Arun Killu
la source
3

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

J'avais un script package.json pour démarrer le nœud: "start": "node index.js"

Chaque fois que j'utilisais cela, que je le tue avec ctrl + c, je rencontrais ce problème.

Si je viens de courir node index.jsdepuis git bash au lieu denpm run start et de tuer avec ctrl + c, je n'ai jamais eu cette erreur.

Je ne sais pas pourquoi, mais j'ai pensé que cela pourrait aider quelqu'un.

vapurrmaid
la source
1
je reçois le même problème avec essentiellement la même configuration. dans mon cas, j'ai remarqué que l'exécution d'une application express via npm engendre deux processus, mais un seul est fermé lorsque vous utilisez ctrl + c. lors du démarrage de l'application avec juste un nœud, un seul processus est ouvert et il se ferme correctement.
worc
1
ce problème de git pour windows est une sorte de lumière sur le tout. il semble qu'il puisse y avoir un bogue quelque part entre mintty et une dépendance cygwin.
worc
3

Solution d'interface utilisateur Pour les utilisateurs de Windows: j'ai trouvé que les meilleures réponses ne fonctionnaient pas pour moi, elles semblaient être des commandes pour les utilisateurs Mac ou Linux. J'ai trouvé une solution simple qui ne nécessitait aucune commande à retenir: ouvrez le Gestionnaire des tâches (ctrl + shift + esc). Regardez les processus d'arrière-plan en cours d'exécution. Trouvez n'importe quoi Node.js et terminez la tâche.

Après avoir fait cela, le problème a disparu pour moi. Comme indiqué dans d'autres réponses, ce sont des processus d'arrière-plan qui sont toujours en cours d'exécution car une erreur a été rencontrée précédemment et les fonctions de sortie / nettoyage normales n'ont pas été appelées, donc une façon de les tuer est de trouver le processus dans le Gestionnaire des tâches et de le tuer là-bas . Si vous avez exécuté le processus à partir d'un terminal / powerShell, vous pouvez généralement utiliser ctrl + c pour le tuer.

technoman23
la source
Oui, bien merci pour votre réponse
DINA TAKLIT
2

Le nœud fonctionne quelque part en mémoire et ce port est verrouillé. Sous Windows, ce problème se produira, comme la plupart des problèmes Windows, être résolu en appuyant sur CTRL+ ALT+ DELet / ou en redémarrant.

user1354017
la source
Cette question répond à tant d'autres questions. Éteignez-le et rallumez-le. Génie.
datUser
1

Les raisons de ce problème sont les suivantes:

  1. N'importe quelle application peut être exécutée sur ce port comme Skype.
  2. Le nœud peut avoir planté et le port n'a peut-être pas été libéré.
  3. Vous avez peut-être essayé de démarrer plusieurs serveurs. Pour résoudre ce problème, on peut maintenir un booléen pour vérifier si le serveur a été démarré ou non. Il ne doit être démarré que si booléen retourne false ou indéfini;
Vish
la source
1

server.close () prend un certain temps pour fermer la connexion, nous devons donc en faire un appel asynchrone en tant que tel:

await server.close();

IMPORTANT: lors de l'utilisation de l' attente , nous devons utiliser le mot-clé async dans notre fonction d'encapsulation en tant que tel:

async () => {
  await server.close();
}
Andreas Bigger
la source
1

Utilisez la commande ci-dessous dans le terminal / cmd pour changer le port (npm run dev est pour node.js), vous pouvez avoir d'autres commandes pour exécuter votre application, la plupart d'entre elles fonctionneront tout en changeant le port, plus facilement et plus rapidement. De plus, vous pouvez utiliser n'importe quel numéro de port libre dans votre système au lieu de 3002

PORT=3002 npm run dev

La plupart du temps, lorsque l'on exécute le projet tout en en quittant un brusquement ou sans le savoir, appuie sur Ctrl + Z qui vous permet de quitter le port. Choisissez toujours Ctrl + C qui ne sortira pas du port pour exécuter le serveur ou le projet.

De plus, il est temps de changer le numéro de port dans votre code

server.listen(3002);
Ruchir
la source
0

Cela signifie que vous avez deux serveurs de nœuds exécutés sur le même port, si l'un s'exécute sur le port, disons 3000, changez l'autre en un autre port, disons 3001 et tout fonctionnera bien

shadrack Mwangi
la source