web-dev-qa-db-fra.com

Comment arrêter une application que node.js express 'npm start'

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
72
ngungo

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.

49
Evan Carroll

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"
}

server.js - Votre truc express habituel habite ici

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);
  });
});

server.stop.js

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);
});

Testez le

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.

27
danday74

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.

13
Sebastian Sprenger

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
5
Samuel Ivan

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

4
Rusty Shackleford

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
3
rajkaran singh

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
2
rogersfo

Si vous avez déjà essayé ctrl + c et que cela ne fonctionne toujours pas, vous pouvez essayer ceci. Cela a fonctionné pour moi.

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

 enter image description here 

  1. Ensuite, vous exécutez cette commande après avoir identifié le PID.

    taskkill /PID <typeyourPIDhere> /F

 enter image description here 

Félicitations à @mit $ ingh de http://www.callstack.fr/tech/blog/windows-kill-process-by-port-number-157

0
Jamezuh

Sous MAC OS X (/ BSD): Vous pouvez essayer d’utiliser la commande lsof (list open files)

$ Sudo lsof -nPi -sTCP:LISTEN

 enter image description here

et donc

$ kill -9 3320
0
overcomer

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

0
Omar bakhsh