web-dev-qa-db-fra.com

Arrêtez le programme node.js en ligne de commande

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?

262
Eleeist

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

366
Brad

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
304
Jamund Ferguson

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. 

33
Hamid

vous pouvez taper .exit pour quitter le noeud js REPL

21
sunny1304

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.

18
sr77in

Reprendre et tuer le processus:

Ctrl+Z le suspend, ce qui signifie qu'il est toujours en cours d'exécution en tant que processus en arrière-plan suspendu.

Vous êtes probablement sur un terminal Invite ...

  1. Exécutez la commande fgpour reprendre le processus au premier plan.

  2. type Ctrl+C pour le tuer correctement.


Alternativement, vous pouvez le tuer manuellement comme ceci:

( 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.

16
Metagrapher

$ 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
14
Maxim Yefremov

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'])
6
Jason

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:

  1. Taper .exit dans nodejs REPL.
  2. En appuyant deux fois sur <ctrl>-C
  3. en appuyant sur <ctrl>-D
  4. 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. 
  5. 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). 

Exemple:

Installer pour toujours

npm install forever -g

Exécuter le serveur de nœud

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

Résultat:

info: Forever processing file: server.js

Serveur de nœud d'arrêt

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.

3
Decoded

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.

2
Robert Molina

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

2
BigEgg

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

0
Ank_247shbm

Pour MacOS

  1. Terminal ouvert
  2. Exécutez le code ci-dessous et appuyez sur Entrée

     Sudo kill $(Sudo lsof -t -i:4200)
    
0
Siddhant Senapati

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?

0
Edan Chetrit

Pour Windows, commencez par rechercher le PID avec votre numéro de port.

netstat -ano | findStr "portNumber"

Après cela, tuez la tâche, assurez-vous d’être à la racine de votre lecteur "c" enter image description here Et la commande sera taskkill /F /PID your pid

0
gem007bd