905 votes

Node / Express : EADDRINUSE, Adresse déjà utilisée - Tuer le serveur

J'ai un serveur simple qui fonctionne en node.js en 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 rencontre est le suivant

EADDRINUSE, Address already in use

Je reçois cette erreur lorsque je relance mon application après qu'elle se soit écrasée ou qu'elle ait eu des erreurs. Puisque je n'ouvre pas une nouvelle instance de terminal, je ferme le processus avec ctr + z .

Je suis presque certain que tout ce que j'ai à faire est de fermer le serveur ou la connexion. J'ai essayé d'appeler server.close() en process.on('exit', ...); sans succès.

47 votes

En fait, au lieu de Ctrl + z vous devez utiliser Ctrl + c qui fermera le programme correctement en envoyant SIGQUIT :) Voir le wiki pour plus de détails :)

1 votes

Vous voulez dire SIGINT. SIGQUIT est dû à `ctrl + ``.

0 votes

Utilice server.close() pour les serveurs précédents

663voto

djburdick Points 2254

Vous pouvez également utiliser la ligne de commande :

ps aux | grep node

pour obtenir les identifiants des processus.

Ensuite :

kill -9 PID

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

0 votes

Ce qui a vraiment résolu le problème pour moi, c'est de faire deux choses. 1. Exécuter mon serveur comme un démon / travail. 2. lors de l'exécution dans bash, tuer le processus avec ctrl + c. L'erreur bizarre provoque parfois le plantage inattendu de l'application, alors j'utilise habituellement 'kill <pid>'.

2 votes

ps aux | grep node ne montre rien ; toujours textareaserver --editor-cmd='gvim -f' échoue : 14 Mar 21:19:30 - socket.io ready - accepting connections Could now start the server : EADDRINUSE, Adresse déjà utilisée

147 votes

Pourquoi cela plutôt que killall -9 node

314voto

Sushil Points 1573

J'ai fait ça sur mon ordinateur portable sous win8. Ça a marché.

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.

1 votes

Je l'exécutais depuis la fenêtre de commande et l'ai fermée par accident. Le nœud a continué à fonctionner en 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 était connecté à lui via des web-sockets, il s'est finalement terminé.

29 votes

taskkill /F /IM node.exe fonctionne comme un charme pour moi sous Windows à partir de n'importe quel répertoire :-) Merci pour le partage !

5 votes

C'est la seule solution à ligne unique qui fonctionne sous Windows que j'ai pu vérifier.

215voto

captainclam Points 2942

J'ai découvert que le moyen le plus rapide de résoudre ce problème était.. :

killall node

182voto

Tor Valamo Points 14209

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

En cas d'accident, faites process.on('uncaughtException', ..) et sur tuer faire process.on('SIGTERM', ..)

Cela dit, SIGTERM (signal d'arrêt par défaut) permet à l'application de faire le ménage, tandis que SIGKILL (arrêt immédiat) ne permet pas à l'application de faire quoi que ce soit.

6 votes

Il est également utile d'accrocher process.on('SIGINT', ... )

43voto

Shripad K Points 6594

Linux

Exécuter ps et déterminez le PID de votre processus de nœud.

Ensuite, exécutez sudo kill PID

Windows

Utilisez tasklist pour afficher la liste des processus en cours :

tasklist /O

Ensuite, tuez le processus du nœud comme suit (en utilisant le PID obtenu à partir de la commande tasklist commande) :

taskkill /pid PID

1 votes

Et si c'est sur Windows ?

1 votes

Juste une remarque... pour une raison quelconque, j'ai dû utiliser des doubles slashs sur mes drapeaux pour la commande taskkill de git-bash : taskkill //IM node.exe et j'ai juste tué le noeud. Ça a marché.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X