Arrêter de nœud.programme js de la ligne de commande
j'ai un serveur TCP simple qui écoute sur un port.
var net = require("net");
var server = net.createServer(function(socket) {
socket.end("Hello!n");
});
server.listen(7777);
je commence par node server.js
et je la ferme ensuite avec Ctrl + Z sur Mac. Quand j'essaie de l'exécuter à nouveau 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 de la mauvaise façon? Comment puis-je éviter cela?
13 réponses
pour terminer le programme, vous devez utiliser Ctrl + c . Si vous faites cela, il envoie SIGINT
, ce qui permet au programme de se terminer avec élégance, en se déliant de tous les ports qu'il écoute.
voir aussi: https://superuser.com/a/262948/48624
Ctrl + Z suspend, ce qui signifie qu'il peut encore être en cours d'exécution.
Ctrl + C le tuera.
vous pouvez aussi le tuer manuellement comme ceci:
ps aux | grep node
trouver le numéro d'identification du procédé (deuxième à partir de la gauche):
kill -9 PROCESS_ID
Cela peut aussi travailler
killall node
ou alternativement vous pouvez faire tout cela dans une ligne:
kill -9 $(ps aux | grep '\snode\s' | awk '{print }')
vous pouvez remplacer le noeud à l'intérieur de '\snode\s' par n'importe quel autre nom de processus.
si vous exécutez un noeud.js de manière interactive (REPL):
Ctrl + C sera de retour que vous > prompt tapez:
process.exit()
ou tout simplement utiliser Ctrl + D .
$ sudo killall node
dans un autre terminal fonctionne sur mac , tandis que killall node
ne fonctionne pas:
$ killall node
No matching processes belonging to you were found
reprendre et tuer le processus:
vous êtes probablement maintenant à une invite de terminal...
-
Donner la commande
fg
pour reprendre le processus au premier plan. -
type Ctrl + C pour bien le tuer.
alternativement, vous pouvez le tuer manuellement comme ceci:
( NOTE: les commandes suivantes peuvent requérir 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 }')
parfois, le processus va énumérer son propre grep, dans ce cas, vous aurez besoin de:
kill $(ps -e | grep dmn | awk '{print }')
.
h/t @ruffin 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 que ce soit une réponse tardive, j'ai trouvé cela de NodeJS docs :
l'événement" exit "est émis lorsque le signal REPL est quitté, soit en recevant la commande
.exit
en entrée, l'utilisateur appuyant deux fois sur<ctrl>-C
pour signaler SIGINT, soit en appuyant sur<ctrl>-D
pour signaler " end " sur le flux d'entrée. Le rappel de l'écouteur est invoqué sans aucun argument.
donc pour vous résumer sortie possible par:
- Taper
.exit
en nodejs REPL. - pression
<ctrl>-C
deux fois. - en appuyant sur
<ctrl>-D
. -
process.exit(0)
signifie une sortie naturelle de REPL. Si vous souhaitez retourner un tout autre statut, vous pouvez retourner un nombre différent de zéro. -
process.kill(process.pid)
est le moyen de tuer à l'aide de l'api nodejs depuis votre code ou depuis REPL.
sur linux, essayez: pkill node
sous windows:
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 tue le processus de votre serveur comme:
require('child_process').exec(`kill -9 ${pid}`)
vérifier ce lien pour le détail: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5
je suis tombé sur un problème où j'ai serveurs à noeuds multiples en cours d'exécution, et je veux juste tuer l'un d'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 que mon appel node
soit aussi précis que possible. Par exemple, plutôt que d'appeler node server.js
depuis le répertoire apps, j'appelle 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 }')
cela ne tuera que le processus de noeud exécutant app_name_1/app/server.js.
si vous avez lancé node app_name_2/app/server.js
ce processus de noeud continuera à fonctionner.
si vous décidez de les tuer, vous pouvez utiliser killall node
comme d'autres l'ont mentionné.
j'ajoute cette réponse parce que pour de nombreux projets avec des déploiements de production, nous avons des scripts qui arrêtent ces processus pour que nous n'ayons pas à le faire.
une façon propre de gérer les processus de votre serveur de noeuds est d'utiliser le paquet forever
(de NPM
).
exemple:
Installer Pour Toujours
npm install forever -g
Exécuter Nœud Serveur
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 Nœud
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 va arrêter proprement votre application de serveur.
Mon cas d'utilisation: MacOS , exécutez/réexécuter 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 }')"
stop 2, Stop 3...
réexécuter : "stop1 & stop2 & ... & stopN ; run
pour en savoir plus sur trouver un processus par un port: qui écoute sur un port TCP donné sur Mac OS X?