Wie kann eine node.js-Anwendung dauerhaft ausgeführt werden?


259

Auf einem Debian-Server habe ich Node.js installiert. Ich verstehe, wie man eine App von Putty mit dieser Befehlszeile startet:

node /srv/www/MyUserAccount/server/server.js

und erhalten Sie es auf der Adresse 50.51.52.53:8080(IP und Port).

Aber sobald ich Kitt schließe, kann ich die Adresse 50.51.52.53:8080nicht mehr erreichen.

Wie kann eine Node.js-Anwendung dauerhaft ausgeführt werden?

Wie Sie sich vorstellen können, bin ich ein Anfänger mit Linux und Node.js.


7
Beachten Sie, dass pm2 eine gute Alternative zu Forever ist , wenn Sie Forever aus irgendeinem Grund nicht verwenden möchten.
Kevin B

danke @KevinB github.com/Unitech/pm2 ist wirklich eine gute Alternative
Sachin Chavan

Antworten:


220

Obwohl die anderen Antworten das Problem des OP lösen, sind sie alle übertrieben und erklären nicht, warum er oder sie dieses Problem hat.

Der Schlüssel ist diese Zeile: "Ich schließe Kitt, dann kann ich die Adresse nicht erreichen."

Wenn Sie auf Putty bei Ihrem Remote-Host angemeldet sind, haben Sie einen SSH-Linux-Prozess gestartet, und alle Befehle, die in dieser SSH-Sitzung eingegeben wurden, werden als untergeordnete Elemente dieses Prozesses ausgeführt.

Ihr Problem ist, dass Sie beim Schließen von Putty die SSH-Sitzung beenden, die diesen Prozess und alle aktiven untergeordneten Prozesse beendet. Wenn Sie Kitt schließen, töten Sie versehentlich Ihren Server, weil Sie ihn im Vordergrund ausgeführt haben . Um dieses Verhalten zu vermeiden, führen Sie den Server im Hintergrund aus, indem Sie & an Ihren Befehl anhängen:

node /srv/www/MyUserAccount/server/server.js &

Das Problem hierbei ist ein Mangel an Linux-Kenntnissen und keine Frage zum Knoten. Weitere Informationen finden Sie unter: http://linuxconfig.org/understanding-foreground-and-background-linux-processes

AKTUALISIEREN:

Wie bereits erwähnt, kann der Knotenserver beim Verlassen des Terminals immer noch sterben. Ein häufiges Problem, auf das ich gestoßen bin, ist, dass der Knotenprozess zwar in bg ausgeführt wird, aber stdout ist und stderr immer noch auf das Terminal zeigt. Dies bedeutet, dass der Knotenserver, der in console.log oder console.error schreibt, einen Pipe-Fehler und einen Absturz erhält. Dies kann vermieden werden, indem Sie die Ausgabe Ihres Prozesses weiterleiten:

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

Wenn das Problem weiterhin besteht, sollten Sie sich mit Dingen wie tmux oder nohup befassen , die immer noch robuster sind als knotenspezifische Lösungen, da sie zum Ausführen aller Arten von Prozessen (Datenbanken, Protokollierungsdienste, andere Sprachen) verwendet werden können.

Ein häufiger Fehler, der zum Beenden des Servers führen kann, besteht darin, dass nohup node your_path/server.js &Sie das Putty-Terminal nach dem Ausführen einfach mit einem einfachen Klick schließen. Sie sollten exitstattdessen den Befehl verwenden, dann ist Ihr Knotenserver betriebsbereit.


7
Wenn Sie die Putty-Sitzung während &des Betriebs immer noch schließen, wird der Dienst trotzdem geschlossen. (Gerade auf Debian Jesse getestet)
NiCk Newman

1
Wie @NiCkNewman sagte, ist diese Antwort unvollständig! Siehe Rick Roys Antwort für die richtige Lösung.
thejonwithnoh

19
Das "&" bewirkt, dass der Prozess im Hintergrund ausgeführt wird, aber Sie müssten tatsächlich "nohup" am Anfang dieses Befehls hinzufügen, um ihn vom Konsolenfenster zu trennen, damit die Anwendung nicht stoppt, wenn das Fenster nach einigen Minuten in den Ruhezustand wechselt Stunden, Änderung des zuvor erwähnten Befehls zu:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge

2
AIX Powersystem, nohup node myApp.js &lief die App in der BG, aber es stirbt, als der Begriff geschlossen wurde. Ich weiß nicht warum.
AnBisw

4
@Annjawn, Sie müssen den exitBefehl verwenden, um das Terminal zu verlassen.
Ionut Necula

342

Sie könnten mit npm wie folgt für immer installieren :

sudo npm install -g forever

Und dann starten Sie Ihre Bewerbung mit:

forever server.js

Oder als Dienstleistung:

forever start server.js

Für immer startet Ihre App neu, wenn sie aus irgendeinem Grund abstürzt oder stoppt. Um Neustarts auf 5 zu beschränken, können Sie Folgendes verwenden:

forever -m5 server.js

So listen Sie alle laufenden Prozesse auf:

forever list

Notieren Sie die Ganzzahl in den Klammern und verwenden Sie sie wie folgt, um einen Prozess zu stoppen:

forever stop 0

Das Neustarten eines laufenden Prozesses erfolgt wie folgt:

forever restart 0

Wenn Sie an Ihrer Anwendungsdatei arbeiten, können Sie den -wParameter verwenden, um automatisch neu zu starten, wenn sich Ihre server.jsDatei ändert:

forever -w server.js

11
@MarthaJames Wenn es geschlossen wird, wenn Ihre SSH-Sitzung / Ihr SSH-Fenster geschlossen wird, haben Sie wahrscheinlich vergessen, "Start" in dieforever start <file>
Kristian

8
Was ist der Unterschied zwischen forever server.jsund forever start server.js? Ich weiß, es heißt "als Dienstleistung", aber was bedeutet das?
Marquizzo

5
Wenn ich eintippe forever server.js, wird der Server gestartet. Wenn ich Ctrl+ drücke C, wird der Dienst beendet. Wenn ich forever start server.jseintippe, wird der Dienst gestartet, und selbst wenn ich Ctrl+ drücke C, bleibt er geöffnet. Sie können dann die anderen oben genannten Befehle ausführen, um die Liste anzuhalten / anzuzeigen. Das habe ich zumindest erlebt.
Termato

6
Startet dies das Skript nach einem Neustart des Servers?
Beingalex

1
Das foreverModul (v0.15.3) ist anfällig für Denial-of-Service-Angriffe mit regulären Ausdrücken und sollte nicht verwendet werden: github.com/foreverjs/forever/issues/960
Benny Neugebauer

82

Sie können PM2 verwenden , einen Produktionsprozessmanager für Node.js-Anwendungen mit integriertem Load Balancer.

Installieren Sie PM2

$ npm install pm2 -g

Starten Sie eine Anwendung

$ pm2 start app.js

Wenn Sie Express verwenden, können Sie Ihre App wie starten

pm2 start ./bin/www --name="app"

Auflistung aller laufenden Prozesse:

$ pm2 list

Es werden alle Prozesse aufgelistet. Sie können Ihren Dienst dann stoppen / neu starten, indem Sie die ID oder den Namen der App mit dem folgenden Befehl verwenden.

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

Protokolle anzeigen

$ pm2 logs ['all'|app_name|app_id]

1
Gott segne dich! Es klappt!! Forever and Nohup funktioniert nicht auf dem Bitnami NodeJS-Server des Amazon-Webdienstes ( docs.bitnami.com/aws/infrastructure/nodejs ). PM2 funktioniert super!
Polras

Diese Bibliothek scheint die höchste Anzahl von Starts auf Github zu haben
DragonFire

41

Ich würde empfehlen, nach etwas wie Forever zu suchen , um Node im Falle eines Absturzes neu zu starten, und dies für Sie zu dämonisieren.


Ich möchte darauf hinweisen, dass ohne nohup, Knoten wird beendet, wenn Sie die SSH-Sitzung beenden, wenn Sie es auf diese Weise ausführen (es sei denn, Sie verwenden etwas wie Bildschirm zu tmux).
Haozhun

1
@ Haozhun, interessant, aber so hat es bei mir auf meinen Maschinen nicht funktioniert. Wenn ich mit diesem Befehl etwas einschalte und starte, wird es auch nach dem Schließen der SSH-Sitzung für immer im Hintergrund ausgeführt.
Brad

@Brad Bitte beachten Sie die 2. Antwort auf stackoverflow.com/questions/4018154/… . Es scheint, dass einige Leute dem ersten Kommentar dieser Frage zustimmen, der erklärt nohup. Es wäre großartig, wenn wir diese Verwirrung lösen könnten. Aber ich weiß nicht, wo ich anfangen soll.
Haozhun

4
Bei den meisten Unixen (einschließlich der meisten Linux-Distributionen) wird der Prozess immer noch beendet, wenn Sie Dinge im Hintergrund ausführen, wenn Sie das Terminalfenster schließen. Um dies zu verhindern, führen Sie es mit aus nohup. Beispiel:nohup node app.js &
Slebetman

1
Ich benutze Forever mit einer Linux-Produktionsumgebung. Ich benutze normalerweise den Befehl für immer starten --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

Wenn Sie Ihre Knoten-App immer nur im Terminal ausführen möchten, verwenden Sie einfach den Bildschirm.

Auf Ubuntu / Debian installieren:

sudo apt-get install screen

Verwendung:

$ screen
$ node /path/to/app.js

ctrl + aund dann ctrl + dzu entlassen

Zu bekommen ist zurück:

Ein Bildschirm: screen -r

Wenn es mehr als einen gibt, können Sie alle Bildschirme auflisten mit: screen -ls

Und dann: screen -r pid_number


1
Dies ist eine gute Option, da ich den Prozess jederzeit in den Vordergrund schalten kann
aexl

26

Sie könnten dies einfach verwenden

nohup node /srv/www/MyUserAccount/server/server.js &

Dadurch bleibt die Anwendung am Laufen, und um sie herunterzufahren, müssen Sie sie beenden.

Dafür könnten Sie den htopKnoten installieren und dann suchen und ihn dann töten


18
Es ist wichtig zu beachten, dass in diesem Fall der Benutzer die PuTTY-Sitzung ordnungsgemäß verlassen muss (dh über den exitBefehl). Wenn der Benutzer das Fenster einfach schließt, kann dies ein anderes Signal als SIGHUPdas Beenden des Prozesses verwenden, und daher würde der Knoten trotzdem heruntergefahren.
thejonwithnoh

1
+1 für eine einfache Allzweck-Linux-Lösung für das Problem. Dies ist besser als die Antwort von DogNibbler .
thejonwithnoh

@thejonwithnoh Nachdem ich Ihren Kommentar gelesen habe, habe ich versucht, Putty abrupt zu schließen, aber der Server funktionierte immer noch. Vielleicht hatte es damit zu tun, wie die Umgebung konfiguriert wurde. Aber ich dachte mir, was das OP verlangte, wäre der einfachste Weg, dies zu erreichen
Rick Roy,

Ich mag diesen einfachen Ansatz, den ich verwende, da der einfachste nur ein ist killall node, der alle Knotenprozesse abbricht, in meinem Fall nur einen.
Nelson

@Nelson Das würde alle Knotenprozesse beenden. Wenn Sie mehrere Skripte ausführen und nur ein bestimmtes beenden möchten, würde ich vorschlagen, dass Sie den Prozess finden und dann diesen bestimmten beenden, nur für den Fall, dass auf einem Produktionsserver mehrere Knotenprozesse ausgeführt werden und möchte nicht in einen Albtraum geraten: D
Rick Roy

12

Forever ist ein sehr gutes NodeJs-Modul, um genau das zu tun.

Installieren Sie, foreverindem Sie in die Befehlszeile eingeben

$ npm install forever -g

Verwenden Sie dann den folgenden Befehl, um ein Skript node.js auszuführen

$ forever start /path/to/script.js

Du bist startklar. Zusätzlich können Sie ausführen

$ forever list

um alle laufenden Skripte zu sehen. Sie können ein bestimmtes Skript durch Eingabe beenden

$ forever stop [pid]

Wo [pid]ist die Prozess-ID des Skripts, das Sie vom listBefehl erhalten. Um alle Skripte zu stoppen, können Sie Folgendes eingeben

$ forever stopall

10

nohup funktioniert ich habe in AWS Ubunto vm eingecheckt folge dem korrektensyntax

ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &

Drücken Sie dann die Eingabetaste. Diese Zeile wird angezeigt

ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to nohup.out

Geben Sie dann Folgendes ein

rm nohup.out

Geben Sie hier die Bildbeschreibung ein


3
Mir gefällt, wie Sie den Hostnamen in der kleinen Bash-Eingabeaufforderung ausgeblendet haben, ihn aber im großen Titel des Fensters belassen haben 😂
conny

10

Installation

$ [sudo] npm install forever -g

Sie können für immer verwenden, um Skripte kontinuierlich auszuführen

forever start server.js

forever list

für Stop-Service

forever stop server.js

9

Hier ist eine Emporkömmling Lösung Ich habe für meine persönlichen Projekte verwenden:

Legen Sie es in /etc/init/node_app_daemon.conf:

description "Node.js Daemon"
author      "Adam Eberlin"

stop on shutdown

respawn
respawn limit 3 15

script
  export APP_HOME="/srv/www/MyUserAccount/server"
  cd $APP_HOME
  exec sudo -u user /usr/bin/node server.js
end script

Dies behandelt auch das Respawn Ihrer Anwendung im Falle eines Absturzes. Es gibt Versuche auf, Ihre Anwendung erneut zu starten, wenn sie in weniger als 15 Sekunden dreimal oder öfter abstürzt.


9

Während der Entwicklung empfehle ich die Verwendung von nodemon . Der Server wird immer dann neu gestartet, wenn sich eine Datei ändert. Wie andere bereits betont haben, ist Forever eine Option, aber in der Produktion hängt alles von der Plattform ab, die Sie verwenden. In der Regel möchten Sie die vom Betriebssystem empfohlene Methode zur Aufrechterhaltung der Dienste verwenden (z . B. http://www.freedesktop.org/wiki/Software/systemd/ ).


Dies funktionierte für mich in einer MEAN.JS-Anwendung - nodemonführt den Befehl grunt aus, es sei denn, Sie geben eine Server-JS-Datei an, daher verwende ich diese
Option

8

Ich habe für immer gefunden, den Job perfekt zu machen.

Angenommen, Sie haben npm bereits installiert. Wenn nicht, tun Sie es einfach

sudo apt-get install npm

Dann für immer installieren

npm install forever --global

Jetzt können Sie es so ausführen

forever start app.js

https://codingweb.io/run-nodejs-application-background/


npm rm -g für immer zum Entfernen
DragonFire


5

Eine andere Möglichkeit besteht darin, eine Systemeinheit für Ihre App zu erstellen. Erstellen Sie eine "XXX.service" -Datei im Ordner "/ etc / systemd / system", ähnlich wie folgt:

[Unit]
Description=swagger
After=network.target

[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

Ein Vorteil ist, dass die App als Dienst ausgeführt wird und bei einem Absturz automatisch neu gestartet wird.

Sie können es auch mit sytemctl verwalten:

systemctl start XXXum den Dienst zu starten, ihn systemctl stop XXXzu stoppen und systemctl enable XXXdie App beim Systemstart automatisch zu starten.


4

Ich hoffe, dies wird dir helfen.

Installieren Sie in der Befehlszeile für immer:

npm install forever -g

Erstellen Sie eine Beispieldatei:

sudo nano server.js 

Sie können die Datei bearbeiten und Ergebnisse direkt in Ihrem Browser erhalten.
Sie können Filezilla oder einen beliebigen Editor verwenden, um die Datei zu bearbeiten. Führen Sie diesen Befehl aus, um die Datei auszuführen:

forever start --minUptime 1 --spinSleepTime 1000 -w server.js

Geben Sie hier die Bildbeschreibung ein


3

Sie müssen kein anderes Paket installieren.

Führen Sie diesen Befehl aus

node server.js > stdout.txt 2> stderr.txt &

server.js ist Ihre Serverdatei oder kann api.js sein

Danach klicken Sie auf " Beenden ", um das Terminal zu schließen

exit


0

Das für immer funktionierende Paket hat für mich funktioniert, nur eine Sache, es hängt von Deep-Equal ab . Wenn Sie also Probleme mit der Installation hatten, wie folgt:

npm -g install forever

Versuchen:

npm -g install forever deep-equal@1.1.1

stattdessen.

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.