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:8080
nicht 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.
Antworten:
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:
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:
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 solltenexit
stattdessen den Befehl verwenden, dann ist Ihr Knotenserver betriebsbereit.quelle
&
des Betriebs immer noch schließen, wird der Dienst trotzdem geschlossen. (Gerade auf Debian Jesse getestet)nohup node /srv/www/MyUserAccount/server/server.js &
nohup node myApp.js &
lief die App in der BG, aber es stirbt, als der Begriff geschlossen wurde. Ich weiß nicht warum.exit
Befehl verwenden, um das Terminal zu verlassen.Sie könnten mit npm wie folgt für immer installieren :
Und dann starten Sie Ihre Bewerbung mit:
Oder als Dienstleistung:
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:
So listen Sie alle laufenden Prozesse auf:
Notieren Sie die Ganzzahl in den Klammern und verwenden Sie sie wie folgt, um einen Prozess zu stoppen:
Das Neustarten eines laufenden Prozesses erfolgt wie folgt:
Wenn Sie an Ihrer Anwendungsdatei arbeiten, können Sie den
-w
Parameter verwenden, um automatisch neu zu starten, wenn sich Ihreserver.js
Datei ändert:quelle
forever start <file>
forever server.js
undforever start server.js
? Ich weiß, es heißt "als Dienstleistung", aber was bedeutet das?forever server.js
, wird der Server gestartet. Wenn ichCtrl
+ drückeC
, wird der Dienst beendet. Wenn ichforever start server.js
eintippe, wird der Dienst gestartet, und selbst wenn ichCtrl
+ drückeC
, 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.forever
Modul (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/960Sie können PM2 verwenden , einen Produktionsprozessmanager für Node.js-Anwendungen mit integriertem Load Balancer.
Installieren Sie PM2
Starten Sie eine Anwendung
Wenn Sie Express verwenden, können Sie Ihre App wie starten
Auflistung aller laufenden Prozesse:
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.
Protokolle anzeigen
quelle
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.
quelle
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).nohup
. Es wäre großartig, wenn wir diese Verwirrung lösen könnten. Aber ich weiß nicht, wo ich anfangen soll.nohup
. Beispiel:nohup node app.js &
Wenn Sie Ihre Knoten-App immer nur im Terminal ausführen möchten, verwenden Sie einfach den Bildschirm.
Auf Ubuntu / Debian installieren:
Verwendung:
ctrl + a
und dannctrl + d
zu entlassenZu 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
quelle
Sie könnten dies einfach verwenden
Dadurch bleibt die Anwendung am Laufen, und um sie herunterzufahren, müssen Sie sie beenden.
Dafür könnten Sie den
htop
Knoten installieren und dann suchen und ihn dann tötenquelle
exit
Befehl). Wenn der Benutzer das Fenster einfach schließt, kann dies ein anderes Signal alsSIGHUP
das Beenden des Prozesses verwenden, und daher würde der Knoten trotzdem heruntergefahren.killall node
, der alle Knotenprozesse abbricht, in meinem Fall nur einen.Forever ist ein sehr gutes NodeJs-Modul, um genau das zu tun.
Installieren Sie,
forever
indem Sie in die Befehlszeile eingebenVerwenden Sie dann den folgenden Befehl, um ein Skript node.js auszuführen
Du bist startklar. Zusätzlich können Sie ausführen
um alle laufenden Skripte zu sehen. Sie können ein bestimmtes Skript durch Eingabe beenden
Wo
[pid]
ist die Prozess-ID des Skripts, das Sie vomlist
Befehl erhalten. Um alle Skripte zu stoppen, können Sie Folgendes eingebenquelle
quelle
Installation
Sie können für immer verwenden, um Skripte kontinuierlich auszuführen
für Stop-Service
quelle
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
: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.
quelle
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/ ).
quelle
nodemon
führt den Befehl grunt aus, es sei denn, Sie geben eine Server-JS-Datei an, daher verwende ich dieseIch habe für immer gefunden, den Job perfekt zu machen.
Angenommen, Sie haben npm bereits installiert. Wenn nicht, tun Sie es einfach
Dann für immer installieren
Jetzt können Sie es so ausführen
https://codingweb.io/run-nodejs-application-background/
quelle
Installieren Sie pm2 zuerst global
dann fang an
quelle
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:
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 XXX
um den Dienst zu starten, ihnsystemctl stop XXX
zu stoppen undsystemctl enable XXX
die App beim Systemstart automatisch zu starten.quelle
Ich hoffe, dies wird dir helfen.
Installieren Sie in der Befehlszeile für immer:
Erstellen Sie eine Beispieldatei:
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:
quelle
Sie müssen kein anderes Paket installieren.
Führen Sie diesen Befehl aus
server.js ist Ihre Serverdatei oder kann api.js sein
Danach klicken Sie auf " Beenden ", um das Terminal zu schließen
quelle
Ich empfehle die Verwendung von PM2, einem Prozessmanager für Node.js-Anwendungen. PM2 bietet eine einfache Möglichkeit, Anwendungen zu verwalten und zu dämonisieren (sie als Dienst ausführen).
Verweisen Sie auf diesen Link - https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-centos-7
quelle
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:
Versuchen:
stattdessen.
quelle