So starten Sie einen node.js-Server neu

81

Ich habe einen node.js-Server unter osx installiert und verwende ihn. Ich habe ein Chat-Modul erstellt und führe es gerne aus. Ich habe einige Teile geändert und muss den Server neu starten, um die Auswirkungen zu sehen.

Ich kann nur neu starten, indem ich das Terminalfenster schließe, es wieder öffne und dann den Knoten chatdemo.js erneut ausführe.

Wie kann ich neu starten, ohne das Terminal zu schließen?

Vielen Dank.

jsnoob
quelle
1
Verwenden Sie für immer github.com/foreverjs/forever . Dann müssen Sie nur noch forever restart
eingeben

Antworten:

102

Wenn es nur läuft (kein Daemon), dann benutze einfach Ctrl-C.

Wenn es daemonisiert ist, können Sie versuchen:

$ ps aux | grep node
you   PID  1.5  0.2  44172  8260 pts/2    S    15:25   0:00 node app.js
$ kill -2 PID

Wo PIDwird durch die Nummer in der Ausgabe von ersetzt ps.

rfunduk
quelle
8
Sie können auch "killall -2 node" verwenden, was den gleichen Effekt hat.
user123444555621
2
Sie möchten / müssen nicht alle Knotenprozesse beenden. Wenn ich einige Knotenrepls offen habe, werde ich nach dieser Zeile ein unglücklicher Camper sein :)
rfunduk
7
Randnotiz: Starten Sie einen Node Daemon vonnohup node server.js &
Drew LeSueur
52

Während der Entwicklung können Sie den Server am besten neu starten, um die vorgenommenen Änderungen anzuzeigen. Verwenden Sie dazu nodemon

npm install nodemon -g

nodemon [dein App-Name]

nodemon überwacht die Dateien in dem Verzeichnis, in dem nodemon gestartet wurde. Wenn sie sich ändern, wird Ihre Knotenanwendung automatisch neu gestartet.

Überprüfen Sie das Nodemon Git Repo: https://github.com/remy/nodemon

Nikhil Vishnu
quelle
Ich wusste nichts über dieses Modul, es ist etwas sehr Nützliches, erinnert mich an meine Django-App. Vielen Dank.
Hola Soja Edu Feliz Navidad
Fantastischer Vorschlag. Sehr effizient für die Entwicklung, um Code schnell zu testen.
mbokil
ok danke, wie können wir eclipse so konfigurieren, dass nodemon anstelle von node verwendet wird?
Alexander Mills
16

In diesem Fall starten Sie Ihren node.js-Server häufig neu, da er sich in der aktiven Entwicklung befindet und Sie ständig Änderungen vornehmen. Es gibt ein großartiges Hot-Reload- Skript, das dies für Sie erledigt, indem es alle Ihre .js-Dateien überwacht und Ihren node.js-Server neu startet, wenn sich eine dieser Dateien geändert hat. Nur das Ticket für schnelle Entwicklung und Test.

Das Skript und die Erklärung zur Verwendung finden Sie hier bei Draco Blue .

Paul Robinson
quelle
5
Zu Ihrer Information, es gibt jetzt mehrere Knotenmodule, die genau dafür vorgesehen sind. Schauen Sie sich die Wiki-Seite Knotenmodule an .
Marco
14

Ich hatte das gleiche Problem und schrieb dann dieses Shell-Skript, das alle vorhandenen Knotenprozesse beendet:

#!/bin/bash
echo "The following node processes were found:"
ps aux | grep " node " | grep -v grep
nodepids=$(ps aux | grep " node " | grep -v grep | cut -c10-15)

echo "OK, so we will stop these process/es now..."

for nodepid in ${nodepids[@]}
do
echo "Stopping PID :"$nodepid
kill -9 $nodepid
done
echo "Done"

Nachdem dies als Shell-Skriptdatei (xxx.sh) gespeichert wurde, möchten Sie es möglicherweise wie hier beschrieben zu Ihrem PATH hinzufügen .

(Bitte beachten Sie, dass dadurch alle Prozesse mit dem Namen "node" außer dem von grep beendet werden. In einigen Fällen werden möglicherweise auch andere Prozesse mit einem ähnlichen Namen beendet.)

Krokodil
quelle
2
Ich bin auf Mac OSX, den ich verwenden musstecut -c17-20
Thomas Reggi
1
Ist das nicht genau das, wofür pkill node?
Tandrewnichols
6

"Nodemon" zu sagen würde die Frage beantworten.

Aber wie man nur (alle) Knotendämonen tötet, funktioniert für mich wie folgt:

pkill -HUP node
spaxxUnited
quelle
5

Ich verstehe, dass sich mein Kommentar auf Windows bezieht, aber möglicherweise ist jemand nützlich. Für den Gewinnlauf in cmd:

wmic process  where "commandline like '%my_app.js%' AND name='node.exe' " CALL Terminate

Dann können Sie Ihre App erneut ausführen:

node my_app.js

Sie können es auch in Batch-Dateien mit Anführungszeichen verwenden:

wmic process  where "commandline like '%%my_app.js%%' AND name='node.exe' " CALL Terminate
node my_app.js
dimaqw
quelle
Sehr praktisch! Großartige Idee.
Radmation
2

Die Verwendung von "kill -9 [PID]" oder "killall -9 node" hat bei mir funktioniert, während "kill -2 [PID]" nicht funktioniert hat.

Steven H.
quelle
2

Wenn ich die Knoten-App nur über die Konsole ausführe (nicht für immer usw.), verwende ich Strg + C. Ich bin mir nicht sicher, ob OSX dieselbe Tastenkombination zum Beenden hat, aber viel schneller als die Prozess-ID zu finden und zu beenden. Sie können auch die hinzufügen Folgen Sie dem Code für die Chat-App, die Sie verwenden, und geben Sie "exit" in die Konsole ein, wenn Sie die App schließen möchten.

process.stdin.resume();
process.stdin.setEncoding('utf8');

process.stdin.on('data', function(data) {
  if (data == 'exit\n') process.exit();
});
user511941
quelle
1

Öffnen Sie zuerst das Terminal / die Befehlszeile und wechseln Sie dann in Ihr Projektverzeichnis. Installieren Sie nun nodemon mit dem Befehl npm install nodemon --save-dev. Dieser Befehl stellt sicher, dass er als Entwicklerabhängigkeit gespeichert wird. Wenn Sie mit expressjs arbeiten, sieht es in Ihrer Paketdatei so aus

{
  "name": "expressjs-app",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "morgan": "~1.9.1",
    "pug": "^2.0.4"
  },
  "devDependencies": {
    "nodemon": "^2.0.3"
  }
}

Ändern Sie jetzt den Wert "start" in Ihrer Datei package.json. Für die Produktion verwenden wir den Exititing-Wert, für die Entwicklung verwenden wir nodemon, um die Änderungen in der Quelldatei zu verfolgen, ohne den Server neu zu starten. Dort für neuen Wert für Start ist "Start": "wenn [[$ NODE_ENV == 'Produktion']]; dann Knoten ./bin/www; sonst Knoten ./bin/www; fi"

Die endgültige Datei package.json sieht folgendermaßen aus

{
  "name": "expressjs-app",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "if [[$NODE_ENV=='production']]; then node ./bin/www; else nodemon ./bin/www; fi"
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "morgan": "~1.9.1",
    "pug": "^2.0.4"
  },
  "devDependencies": {
    "nodemon": "^2.0.3"
  }
}

Um nodemon jusy zu deinstallieren, führen Sie einfach den Befehl npm uninstall nodemon aus

Herr
quelle