J’ai un simple serveur TCP 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
et le ferme avec Ctrl + Z sur Mac. Lorsque j’essaie de le node server.js
avec node server.js
je reçois ce message d’erreur:
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 devez utiliser Ctrl + C. Si vous faites cela, il envoie SIGINT
, ce qui permet au programme de se terminer normalement, en se déconnectant des ports sur lesquels il écoute.
Voir aussi: https://superuser.com/a/262948/48624
Ctrl + Z le suspend, ce qui signifie qu’il peut toujours être en cours d’exécution.
Ctrl + C va réellement le tuer.
vous pouvez aussi le tuer manuellement comme ceci:
ps aux | grep node
Trouvez l’ID du processus (deuxième à partir de la gauche):
kill -9 PROCESS_ID
Cela peut aussi fonctionner
killall node
Ou bien vous pouvez faire tout cela en une seule ligne:
kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')
Vous pouvez remplacer le noeud à l’intérieur de \ snode \ s par n’importe quel autre nom de processus.
vous pouvez taper .exit
pour quitter le noeud js REPL
Si vous exécutez Node.js de manière interactive (REPL):
Ctrl + C vous ramènera à> prompt puis tapez:
process.exit()
ou utilisez simplement Ctrl + D.
$ 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
Ctrl + Z le suspend, ce qui signifie qu’il est toujours en cours d’exécution en arrière-plan.
Vous êtes probablement maintenant à une invite de terminal …
Donnez la commande fg
pour reprendre le processus au premier plan.
tapez Ctrl + C pour le tuer correctement.
( REMARQUE: les commandes suivantes peuvent nécessiter root, donc sudo ...
est votre ami)
pkill -9 node
ou, si vous n’avez pas de pkill, cela peut marcher:
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.
Bien qu’il s’agisse d’une réponse tardive, je l’ai trouvée dans la documentation de NodeJS :
L’événement ‘exit’ est émis lorsque vous quittez la REPL en recevant la commande
.exit
en entrée, en appuyant deux fois surpour signaler SIGINT, ou en appuyant sur
-C pour signaler la fin du
-D .exit
stream d’entrée. Le rappel de l’auditeur est appelé sans aucun argument.
Donc, pour résumer, vous pouvez quitter en:
.exit
dans nodejs REPL. -C
-D
. process.exit(0)
signifie une sortie naturelle de REPL. Si vous souhaitez renvoyer un autre statut, vous pouvez renvoyer un numéro non nul. process.kill(process.pid)
est le moyen de tuer en utilisant nodejs api depuis votre code ou depuis REPL. sur Linux essayer: pkill node
sur les fenêtres:
Taskkill /IM node.exe /F
ou
from subprocess import call call(['taskkill', '/IM', 'node.exe', '/F'])
Si vous voulez arrêter votre serveur avec npm stop
ou quelque chose comme ça. Vous pouvez écrire le code qui détruit votre processus de serveur en tant que:
require('child_process').exec(`kill -9 ${pid}`)
Consultez ce lien pour plus de détails: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5
J’ai rencontré un problème où plusieurs serveurs de nœuds sont en cours d’exécution et je veux juste tuer l’un d’entre eux et le redéployer à partir d’un script.
Note: Cet exemple est dans un shell bash sur Mac.
Pour ce faire, je m’assure de rendre mon node
aussi précis que possible. Par exemple, au lieu d’appeler le node server.js
partir du répertoire apps, j’appelle le node app_name_1/app/server.js
Alors je peux le tuer en utilisant:
kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')
Cela ne fera que tuer le processus de noeud exécutant nom_application_1 / app / server.js.
Si vous avez exécuté le node app_name_2/app/server.js
ce processus de noeud continuera à s’exécuter.
Si vous décidez de les tuer, vous pouvez utiliser le killall node
comme d’autres l’ont mentionné.
J’ajoute cette réponse car pour de nombreux projets avec des déploiements de production, nous avons des scripts qui arrêtent ces processus, ce qui nous évite de devoir le faire.
Un moyen propre de gérer vos processus Node Server est d’utiliser le package forever
(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.
Mon cas d’utilisation: sous MacOS , exécutez / réexécutez plusieurs serveurs de nœuds sur différents ports à partir d’un script
Exécuter : "cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."
stop1 : "kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"
stop2, stop3 …
"stop1 & stop2 & ... & stopN ; run
: "stop1 & stop2 & ... & stopN ; run
pour plus d’informations sur la recherche d’un processus par un port: Qui écoute sur un port TCP donné sur Mac OS X?