Arrêtez le programme node.js à partir de la ligne de commande

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 

Reprendre et tuer le processus:

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 …

  1. Donnez la commande fg pour reprendre le processus au premier plan.

  2. tapez Ctrl + C pour le tuer correctement.


Alternativement, vous pouvez le tuer manuellement comme ceci:

( 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 sur -C pour signaler SIGINT, ou en appuyant sur -D pour signaler la fin du .exit stream d’entrée. Le rappel de l’auditeur est appelé sans aucun argument.

Donc, pour résumer, vous pouvez quitter en:

  1. Taper .exit dans nodejs REPL.
  2. En appuyant deux fois sur -C
  3. en appuyant sur -D .
  4. process.exit(0) signifie une sortie naturelle de REPL. Si vous souhaitez renvoyer un autre statut, vous pouvez renvoyer un numéro non nul.
  5. 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 ).

Exemple:

Installer pour toujours

npm install forever -g

Exécuter le serveur de noeud

forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js

Résultat:

info: Forever processing file: server.js

Arrêt du serveur de noeud

forever stop server.js

Résultat

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?