So stoppen Sie die App, die node.js 'npm start' ausdrückt


100

Sie erstellen die node.js-App mit Express v4.x und starten Ihre App dann mit npm start . Meine Frage ist, wie man die App stoppt. Gibt es npm stop ?

BEARBEITEN , um den Fehler beim Implementieren von npm stop einzuschließen

/home/nodetest2# npm stop

> nodetest2@0.0.1 stop /home/nodetest2
> pkill -s SIGINT nodetest2

pkill: invalid argument for option 's' -- SIGINT

npm ERR! nodetest2@0.0.1 stop: `pkill -s SIGINT nodetest2`
npm ERR! Exit status 2

Antworten:


66

Ja, npm bietet auch ein Stoppskript:

npm help npm-scripts

Prestop, Stop, Poststop: Wird mit dem Befehl npm stop ausgeführt.

Stellen Sie eine der oben genannten Optionen in Ihrer package.json ein und verwenden Sie sie dann npm stop

npm help npm-stop

Sie können dies wirklich einfach machen, wenn Sie einstellen app.js,

process.title = myApp;

Und dann in scripts.json,

"scripts": {
    "start": "app.js"
    , "stop": "pkill --signal SIGINT myApp"
}

Das heißt, wenn dies ich wäre, würde ich etwas verwenden pm2oder etwas, das dies automatisch auf der Grundlage eines Git-Pushs handhabt.


Immer noch Fehler. Offensichtlich bin ich mit Zeilenbefehlen bestens vertraut.
Ngungo

@ ngungo eher --signal. Verwenden Sie man pkill, um über pkill zu lesen.
Evan Carroll

3
@EvanCarroll Was ist, wenn mehrere Instanzen der App ausgeführt werden?
Amit Kumar Gupta

1
Irgendeine Idee, wie man dies in der Angular 4 App implementiert. Speziell wo richte ich den Prozesstitel ein?
Kiranghule27

40

Alle anderen Lösungen hier sind vom Betriebssystem abhängig. Eine unabhängige Lösung für jedes Betriebssystem verwendet socket.io wie folgt.

package.json hat zwei Skripte:

"scripts": {
  "start": "node server.js",
  "stop": "node server.stop.js"
}

server.js - Hier lebt dein übliches Express-Zeug

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

Probieren Sie es aus

npm start (um deinen Server wie gewohnt zu starten)

npm stop (Dies stoppt jetzt Ihren laufenden Server.)

Der obige Code wurde nicht getestet (es ist eine abgespeckte Version meines Codes, mein Code funktioniert), aber hoffentlich funktioniert er so wie er ist. In beiden Fällen gibt es die allgemeine Richtung vor, die Sie einschlagen müssen, wenn Sie Ihren Server mit socket.io stoppen möchten.


2
Das Schöne an diesem Ansatz ist, dass Sie ihn grundsätzlich auf jeder Umgebung ausführen können, einschließlich Containern, die normalerweise die Art und Weise, wie Sie Prozesse manipulieren, stark einschränken. Aus meiner ganz persönlichen Perspektive - das ist der eleganteste Ansatz.
Der Zinger

16

Als ich die vorgeschlagene Lösung ausprobierte, stellte ich fest, dass mein App-Name abgeschnitten war. Ich habe process.titlein der NodeJS-Dokumentation ( https://nodejs.org/docs/latest/api/process.html#process_process_title ) nachgelesen und es heißt

Unter Linux und OS X ist es auf die Größe des Binärnamens plus die Länge der Befehlszeilenargumente beschränkt, da der argv-Speicher überschrieben wird.

Meine App verwendet keine Argumente, daher kann ich diese Codezeile zu meiner hinzufügen app.js

process.title = process.argv[2];

und fügen Sie dann diese paar Zeilen zu meiner package.jsonDatei hinzu

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

wirklich lange Prozessnamen verwenden. npm startund npm stopArbeit wird natürlich npm stopimmer alle laufenden Prozesse beenden, aber das ist für mich in Ordnung.


12

Dies ist ein Mintty-Versionsproblem. Alternativ können Sie auch cmd verwenden. Um den Serverprozess zu beenden, führen Sie einfach diesen Befehl aus:

    taskkill -F -IM node.exe

1
Es ist keine gute Idee, main node.exe zu beenden, da dies zu Problemen führen kann, wenn mehrere Knoten-Apps ausgeführt werden
user889030

11

Unter MAC OS X (/ BSD): Sie können versuchen, den Befehl lsof (Liste offener Dateien) zu verwenden

$ sudo lsof -nPi -sTCP:LISTEN

Geben Sie hier die Bildbeschreibung ein

und so

$ kill -9 3320

9

Überprüfen Sie mit netstat -nptl alle Prozesse

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 

Und es beendet einfach den Prozess durch die PID-Referenz .... In meinem Fall möchte ich die 6231 / nodejs stoppen, damit ich den folgenden Befehl ausführe:

kill -9 6231

1
Ich denke, das OP sucht nach einer NPM-Skriptoption, nicht nach einer Konsole.
Faraji Anderson

4

Hier ist eine weitere Lösung, die Ideen aus den vorherigen Antworten mischt. Es wird der "Kill-Prozess" -Ansatz verfolgt, während die Bedenken hinsichtlich der Plattformunabhängigkeit ausgeräumt werden.

Es basiert auf dem Tree-Kill- Paket, um das Beenden des Server-Prozessbaums zu handhaben. Ich fand es in meinen Projekten notwendig, den gesamten Prozessbaum zu beenden, da einige Tools (z. B. babel-node) untergeordnete Prozesse erzeugen. Wenn Sie nur einen einzelnen Prozess beenden müssen, können Sie Tree-Kill durch die integrierte process.kill()Methode ersetzen .

Die Lösung lautet wie folgt (die ersten beiden Argumente spawn()sollten geändert werden, um das spezifische Rezept für die Ausführung Ihres Servers widerzuspiegeln):

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

Beachten Sie, dass diese Lösung das Startskript vom Server trennt (dh npm startsofort zurückkehrt und nicht blockiert, bis der Server gestoppt wird). Wenn Sie das traditionelle Blockierungsverhalten bevorzugen, entfernen Sie einfach das options.detachedArgument spawn()und den Aufruf von child.unref().


3

Wenn Sie es bereits versucht haben ctrl + cund es immer noch nicht funktioniert, möchten Sie dies möglicherweise versuchen. Das hat bei mir funktioniert.

  1. Führen Sie die Befehlszeile als Administrator aus. Führen Sie dann den folgenden Befehl aus, um die Prozess-ID (PID) zu finden, die Sie beenden möchten. Geben Sie Ihre Portnummer ein<yourPortNumber>

    netstat -ano | findstr :<yourPortNumber>

Geben Sie hier die Bildbeschreibung ein

  1. Anschließend führen Sie diesen Befehl aus, nachdem Sie die PID identifiziert haben.

    taskkill /PID <typeYourPIDhere> /F

Geben Sie hier die Bildbeschreibung ein

Ein großes Lob an @mit $ ingh von http://www.callstack.in/tech/blog/windows-kill-process-by-port-number-157


2

Wenn es sehr einfach ist, beenden Sie einfach den Prozess.

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

1

Für Windows-Computer (ich bin unter Windows 10), wenn STRG + C (Abbrechen / Abbrechen) Befehl auf CLI nicht funktioniert und der Bildschirm wie folgt angezeigt wird:

Geben Sie hier die Bildbeschreibung ein

Versuchen Sie zuerst die EINGABETASTE zu drücken (oder eine beliebige Taste würde dies tun) und dann STRG + C, und der aktuelle Prozess fragt Sie, ob Sie den Stapeljob beenden möchten:

Geben Sie hier die Bildbeschreibung ein

Möglicherweise beendet STRG + C den übergeordneten Prozess nur, während npm start mit anderen untergeordneten Prozessen ausgeführt wird. Sie sind sich nicht sicher, warum Sie diese zusätzliche Taste vor STRG + C drücken müssen, aber es funktioniert besser, als die Befehlszeile zu schließen und erneut zu starten.

Ein verwandtes Problem, das Sie möglicherweise überprüfen möchten: https://github.com/mysticatea/npm-run-all/issues/74




0

Falls Ihre JSON-Datei kein Skript zum Stoppen der App enthält, kann ich nur Strg + C auf dem Cmd drücken.


-1

Alle (3) Lösungen sind:

1- ctlr + C.

2- In der JSON-Datei wird ein Skript geschrieben, das stoppt

"scripts": {"stop": "killall -SIGINT dieser Name kann so lange sein, wie er sein muss"},

* als im Befehl schreiben // npm stop //

3- Starten Sie den PC neu


7
Starten Sie den PC wirklich neu?!? Warum nicht einfach den Hauptschalter umlegen? : D
stk

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.