J'ai un simple TCP serveur qui écoute sur un port.
var net = require("net");
var server = net.createServer(function(socket) {
socket.end("Hello!\n");
});
server.listen(7777);
Je le lance avec node server.js
puis le ferme avec Ctrl + Z sur Mac. Lorsque j'essaie de l'exécuter à nouveau avec node server.js
, le message d'erreur suivant s'affiche:
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: listen EADDRINUSE
at errnoException (net.js:670:11)
at Array.0 (net.js:771:26)
at EventEmitter._tickCallback (node.js:192:41)
Est-ce que je ferme le programme dans le mauvais sens? Comment puis-je empêcher cela?
Pour terminer le programme, vous devriez utiliser Ctrl + C. Si vous le faites, il envoie SIGINT
, ce qui permet au programme de se terminer normalement, sans liaison entre les ports sur lesquels il écoute.
Voir aussi: https://superuser.com/a/262948/48624
Ctrl+Z le suspend, ce qui signifie qu'il peut toujours fonctionner.
Ctrl+C va réellement le tuer.
vous pouvez aussi le tuer manuellement comme ceci:
ps aux | grep node
Recherchez l'ID de processus (deuxième en partant de la gauche):
kill -9 PROCESS_ID
Cela peut aussi marcher
killall node
Ou bien vous pouvez tout faire en une seule ligne:
kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')
Vous pouvez remplacer le noeud dans '\ snode\s' par tout autre nom de processus.
vous pouvez taper .exit
pour quitter le noeud js REPL
Si vous exécutez Node.js de manière interactive (le REPL):
Ctrl + C vous ramènera à> Invite puis tapez:
process.exit()
ou simplement utiliser Ctrl + D.
Vous êtes probablement sur un terminal Invite ...
Exécutez la commande fg
pour reprendre le processus au premier plan.
type Ctrl+C pour le tuer correctement.
( REMARQUE: les commandes suivantes peuvent nécessiter un accès root, donc Sudo ...
est votre ami)
pkill -9 node
ou, si vous n'avez pas pkill, cela peut fonctionner:
killall node
ou peut-être ceci:
kill $(ps -e | grep node | awk '{print $1}')
parfois, le processus listera son propre grep, auquel cas vous aurez besoin de:
kill $(ps -e | grep dmn | awk '{print $2}')
.
h/t @ruffin à partir des commentaires sur la question elle-même. J'ai eu le même problème et son commentaire m'a aidé à le résoudre moi-même.
$ Sudo killall node
dans un autre terminal fonctionne sur mac , alors que killall node
ne fonctionne pas:
$ killall node
No matching processes belonging to you were found
sur linux, essayez: pkill node
sur les fenêtres:
Taskkill /IM node.exe /F
ou
from subprocess import call
call(['taskkill', '/IM', 'node.exe', '/F'])
Même s’il s’agit d’une réponse tardive, j’ai trouvé ceci dans la documentation de NodeJS :
L'événement 'exit' est émis lorsque REPL est quitté, soit en recevant la commande
.exit
en entrée, en appuyant deux fois sur<ctrl>-C
pour signaler SIGINT, ou en appuyant sur<ctrl>-D
pour signaler 'end' dans le flux d'entrée. Le rappel du programme d'écoute est appelé sans aucun argument.
Donc, pour résumer, vous pouvez sortir par:
.exit
dans nodejs REPL.<ctrl>-C
. <ctrl>-D
. process.exit(0)
signifie une sortie naturelle de REPL. Si vous souhaitez renvoyer tout autre statut, vous pouvez renvoyer un nombre différent de zéro. process.kill(process.pid)
est le moyen de tuer en utilisant nodejs api depuis votre code ou depuis REPL.J'ajoute cette réponse car, pour de nombreux projets avec des déploiements en production, nous avons des scripts qui arrêtent ces processus, ce qui nous évite de le faire.
Un moyen propre de gérer vos processus de serveur de noeud est d'utiliser le package forever
(à partir de NPM
).
npm install forever -g
forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js
info: Forever processing file: server.js
forever stop server.js
info: Forever stopped process:
uid command script forever pid id logfile uptime
[0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0.247
Cela arrêtera proprement votre application serveur.
Réponse tardive mais sous Windows, ouvrir le gestionnaire de tâches avec CTRL + ALT + SUPPR puis tuer les processus Node.js résoudront cette erreur.
Si vous voulez arrêter votre serveur avec npm stop
ou quelque chose comme ceci. Vous pouvez écrire le code qui tue votre processus serveur en tant que:
require('child_process').exec(`kill -9 ${pid}`)
Vérifiez ce lien pour le détail: https://Gist.github.com/dominhhai/aa7f3314ad27e2c50fd5
vous pouvez utiliser la commande suivante pour être spécifique dans localserver kill (ici: 8000)
http: // localhost: 8000 / kill PID (processId):
$:lsof -i tcp:8000
Cela vous donnera les groupes de TCP suivants:
COMMAND PID UTILISATEUR TYPE FD TAILLE DU DISPOSITIF/NOM DE NŒUDS
noeud 21521 ubuntu 12u IPv6 345668 0t0 TCP *: 8000 (LISTEN)
$:kill -9 21521
Il va tuer le processId correspondant à TCP *: 8000
Pour MacOS
Exécutez le code ci-dessous et appuyez sur Entrée
Sudo kill $(Sudo lsof -t -i:4200)
Mon cas d'utilisation: sur MacOS, exécutez/réexécutez plusieurs serveurs de nœuds sur ports différents à partir d'un script
run: "cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."
stop1: "kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"
stop2, stop3 ...
relancez: "stop1 & stop2 & ... & stopN ; run
pour plus d'informations sur la recherche d'un processus par un port: Qui écoute sur un port TCP donné sous Mac OS X?