Vous construisez une application node.js avec Express v4.x, puis démarrez votre application par npm start . Ma question est de savoir comment arrêter l'application? Y a-t-il npm stop ?
EDITpour inclure l'erreur lors de l'implémentation npm stop
/home/nodetest2# npm stop
> [email protected] stop /home/nodetest2
> pkill -s SIGINT nodetest2
pkill: invalid argument for option 's' -- SIGINT
npm ERR! [email protected] stop: `pkill -s SIGINT nodetest2`
npm ERR! Exit status 2
Oui, npm fournit également un script d'arrêt:
npm help npm-scripts
prestop, stop, poststop: exécuté par la commande npm stop.
Définissez l'un des éléments ci-dessus dans votre package.json, puis utilisez npm stop
npm help npm-stop
Vous pouvez rendre cela très simple si vous définissez app.js
,
process.title = myApp;
Et puis dans scripts.json,
"scripts": {
"start": "app.js"
, "stop": "pkill --signal SIGINT myApp"
}
Cela dit, si c’était moi, j’utiliserais pm2
ou quelque chose qui serait automatiquement géré sur la base d’un git Push.
Toutes les autres solutions ici dépendent du système d'exploitation. Une solution indépendante pour tout système d'exploitation utilise socket.io comme suit.
package.json
a deux scripts:
"scripts": {
"start": "node server.js",
"stop": "node server.stop.js"
}
const express = require('express');
const app = express();
const server = http.createServer(app);
server.listen(80, () => {
console.log('HTTP server listening on port 80');
});
// Now for the socket.io stuff - NOTE THIS IS A RESTFUL HTTP SERVER
// We are only using socket.io here to respond to the npmStop signal
// To support IPC (Inter Process Communication) AKA RPC (Remote P.C.)
const io = require('socket.io')(server);
io.on('connection', (socketServer) => {
socketServer.on('npmStop', () => {
process.exit(0);
});
});
const io = require('socket.io-client');
const socketClient = io.connect('http://localhost'); // Specify port if your express server is not using default port 80
socketClient.on('connect', () => {
socketClient.emit('npmStop');
setTimeout(() => {
process.exit(0);
}, 1000);
});
npm start
(pour démarrer votre serveur comme d'habitude)
npm stop
(cela arrêtera maintenant votre serveur en cours d'exécution)
Le code ci-dessus n'a pas été testé (c'est une version réduite de mon code, mon code fonctionne) mais j'espère que cela fonctionne tel quel. Quoi qu'il en soit, il fournit la direction générale à suivre si vous souhaitez utiliser socket.io pour arrêter votre serveur.
Lorsque j'ai essayé la solution suggérée, j'ai réalisé que le nom de mon application était tronqué. J'ai lu process.title
dans la documentation de nodejs ( https://nodejs.org/docs/latest/api/process.html#process_process_title ) et il est indiqué
Sous Linux et OS X, il est limité à la taille du nom binaire et à la longueur des arguments de la ligne de commande, car il écrase la mémoire argv.
Mon application n'utilise aucun argument, je peux donc ajouter cette ligne de code à mon app.js
process.title = process.argv[2];
puis ajoutez ces quelques lignes à mon fichier package.json
"scripts": {
"start": "node app.js this-name-can-be-as-long-as-it-needs-to-be",
"stop": "killall -SIGINT this-name-can-be-as-long-as-it-needs-to-be"
},
d'utiliser des noms de processus très longs. npm start
et npm stop
work, bien sûr, npm stop
mettra toujours fin à tous les processus en cours d'exécution, mais cela me convient.
Vérifiez avec netstat -nptl tous les processus
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 1736/mongod
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1594/sshd
tcp6 0 0 :::3977 :::* LISTEN 6231/nodejs
tcp6 0 0 :::22 :::* LISTEN 1594/sshd
tcp6 0 0 :::3200 :::* LISTEN 5535/nodejs
Et cela tue simplement le processus par la référence PID .... Dans mon cas, je veux arrêter 6231/nodejs afin d'exécuter la commande suivante:
kill -9 6231
Voici une autre solution qui mélange les idées des réponses précédentes. Il adopte l'approche du "processus de destruction" tout en répondant aux préoccupations relatives à l'indépendance de la plate-forme.
Il repose sur le package tree-kill pour gérer la suppression de l’arbre de processus du serveur. J'ai trouvé qu'il était nécessaire de supprimer l'ensemble de l'arborescence des processus dans mes projets, car certains outils (par exemple, babel-node
) génèrent des processus enfants. Si vous n'avez besoin que de tuer un seul processus, vous pouvez remplacer la suppression d'arborescence par la méthode process.kill()
intégrée.
La solution est la suivante (les deux premiers arguments de spawn()
doivent être modifiés pour refléter la recette spécifique d’exécution de votre serveur):
build/start-server.js
import { spawn } from 'child_process'
import fs from 'fs'
const child = spawn('node', [
'dist/server.js'
], {
detached: true,
stdio: 'ignore'
})
child.unref()
if (typeof child.pid !== 'undefined') {
fs.writeFileSync('.server.pid', child.pid, {
encoding: 'utf8'
})
}
build/stop-server.js
import fs from 'fs'
import kill from 'tree-kill'
const serverPid = fs.readFileSync('.server.pid', {
encoding: 'utf8'
})
fs.unlinkSync('.server.pid')
kill(serverPid)
package.json
"scripts": {
"start": "babel-node build/start-server.js",
"stop": "babel-node build/stop-server.js"
}
Notez que cette solution dissocie le script de démarrage du serveur (c'est-à-dire que npm start
sera renvoyé immédiatement et ne sera pas bloqué jusqu'à ce que le serveur soit arrêté). Si vous préférez le comportement de blocage traditionnel, supprimez simplement l'argument options.detached
à spawn()
et l'appel à child.unref()
.
Ceci est un problème de version menthe alternativement utiliser cmd. Pour tuer le processus du serveur, exécutez cette commande:
taskkill -F -IM node.exe
Si est très simple, il suffit de tuer le processus ..
localmacpro$ ps
PID TTY TIME CMD
5014 ttys000 0:00.05 -bash
6906 ttys000 0:00.29 npm
6907 ttys000 0:06.39 node /Users/roger_macpro/my-project/node_modules/.bin/webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
6706 ttys001 0:00.05 -bash
7157 ttys002 0:00.29 -bash
localmacpro$ kill -9 6907 6906
Si vous avez déjà essayé ctrl + c
et que cela ne fonctionne toujours pas, vous pouvez essayer ceci. Cela a fonctionné pour moi.
Exécutez la ligne de commande en tant qu'administrateur. Ensuite, exécutez la commande de mention ci-dessous. tapez votre numéro de port dans votre numéro de port
netstat -ano | findstr :<yourPortNumber>
Ensuite, vous exécutez cette commande après avoir identifié le PID.
taskkill /PID <typeyourPIDhere> /F
Félicitations à @mit $ ingh de http://www.callstack.fr/tech/blog/windows-kill-process-by-port-number-157
Tout (3) solotion est:
1- ctlr + C
2- dans le fichier json un script qui s'arrête
"scripts": {"stop": "killall -SIGINT ce-nom-peut-etre-aussi-aussi-long-que-cela-doit-etre-etre"},
* que dans la commande write // npm stop //
3- Redémarrer le pc