Da dieser Beitrag im Laufe der Jahre viel Aufmerksamkeit auf sich gezogen hat, habe ich die Top-Lösungen pro Plattform am Ende dieses Beitrags aufgelistet.
Ursprünglicher Beitrag :
Ich möchte, dass mein node.js-Server im Hintergrund ausgeführt wird, dh wenn ich mein Terminal schließe, soll mein Server weiter ausgeführt werden. Ich habe dies gegoogelt und mir dieses Tutorial ausgedacht , aber es funktioniert nicht wie beabsichtigt. Anstatt dieses Daemon-Skript zu verwenden, dachte ich, ich hätte nur die Ausgabeumleitung (den 2>&1 >> file
Teil) verwendet, aber auch diese wird nicht beendet - ich erhalte eine leere Zeile in meinem Terminal, als würde sie auf Ausgabe / Fehler warten.
Ich habe auch versucht, den Prozess in den Hintergrund zu stellen, aber sobald ich mein Terminal schließe, wird der Prozess ebenfalls beendet.
Wie kann ich es laufen lassen, wenn ich meinen lokalen Computer herunterfahre?
Top-Lösungen :
- Systemd (Linux)
- Launchd (Mac)
- Knotenfenster (Windows)
- PM2 (Node.js)
Antworten:
Kopieren meiner eigenen Antwort von Wie führe ich eine Node.js-Anwendung als eigenen Prozess aus?
Antwort 2015 : Fast jede Linux-Distribution wird mit systemd geliefert , was bedeutet , dass Monit, PM2 usw. für immer nicht mehr erforderlich sind - Ihr Betriebssystem erledigt diese Aufgaben bereits .
myapp.service
Erstellen Sie eine Datei (ersetzen Sie 'myapp' natürlich durch den Namen Ihrer App):Beachten Sie, wenn Sie neu in Unix sind:
/var/www/myapp/app.js
sollte#!/usr/bin/env node
in der ersten Zeile stehen.Kopieren Sie Ihre Servicedatei in die
/etc/systemd/system
.Beginnen Sie mit
systemctl start myapp
.Aktivieren Sie es, um beim Booten mit ausgeführt zu werden
systemctl enable myapp
.Siehe Protokolle mit
journalctl -u myapp
Dies stammt aus der Bereitstellung von Knoten-Apps unter Linux, Ausgabe 2018 , die auch Befehle zum Generieren einer AWS / DigitalOcean / Azure CloudConfig zum Erstellen von Linux / Knotenservern (einschließlich der
.service
Datei) enthält.quelle
~/.config/systemd/user
, mit startensystemctl --user start myapp
, aktivieren mitsystemctl --user enable myapp
.Sie können Forever, ein einfaches CLI-Tool, verwenden, um sicherzustellen, dass ein bestimmtes Knotenskript kontinuierlich (dh für immer) ausgeführt wird: https://www.npmjs.org/package/forever
quelle
forever start /path/to/yourApp.js
in Ihrem Server-Startskript tun .UPDATE - Wie in einer der folgenden Antworten erwähnt, hat PM2 einige wirklich nette Funktionen, die für immer fehlen. Erwägen Sie, es zu verwenden.
Ursprüngliche Antwort
Verwenden Sie nohup :
BEARBEITEN Ich wollte hinzufügen, dass die akzeptierte Antwort wirklich der richtige Weg ist. Ich verwende für immer Instanzen, die aufbleiben müssen. Ich mache das gerne
npm install -g forever
im Knotenpfad und mache es dann einfachforever start server.js
quelle
nohup
steht fürno hangup
die aus alten Zeiten, wo Sie wollten, dass Sie einen Prozess am Leben erhalten, wenn Sie Ihr Modem "auflegen".Dies ist möglicherweise nicht der akzeptierte Weg, aber ich mache es mit dem Bildschirm, insbesondere während der Entwicklung, weil ich ihn wieder aufrufen und bei Bedarf damit herumalbern kann.
Der Bildschirm löst sich und überlebt das Abmelden. Dann können Sie es wieder zurückholen, indem Sie Bildschirm -r ausführen. Weitere Informationen finden Sie im Bildschirmhandbuch. Sie können die Bildschirme benennen und so weiter, wenn Sie möchten.
quelle
Update 2016: Die Node-Windows / Mac / Linux-Serie verwendet eine gemeinsame API für alle Betriebssysteme, daher ist sie eine absolut relevante Lösung. Jedoch; node-linux generiert systemv init-Dateien. Da systemd immer beliebter wird, ist es unter Linux realistisch gesehen eine bessere Option. PR ist willkommen, wenn jemand Systemd-Unterstützung zu Node-Linux hinzufügen möchte :-)
Original-Thread:
Dies ist jetzt ein ziemlich alter Thread, aber Node-Windows bietet eine andere Möglichkeit, Hintergrunddienste unter Windows zu erstellen. Es basiert lose auf dem
nssm
Konzept der Verwendung einesexe
Wrappers um Ihr Knotenskript. Jedoch; es nutztwinsw.exe
statt und stellt einen konfigurierbaren Knoten Wrapper für weitere granulare Kontrolle darüber , wie der Prozess startet / stoppt auf Ausfälle. Diese Prozesse sind wie jeder andere Dienst verfügbar:Das Modul backt auch einige Ereignisprotokolle:
Die Dämonisierung Ihres Skripts erfolgt über Code. Zum Beispiel:
Das Modul unterstützt Dinge wie das Begrenzen von Neustarts (damit schlechte Skripte Ihren Server nicht beschädigen) und das Erhöhen der Zeitintervalle zwischen Neustarts.
Da Node-Windows-Dienste wie alle anderen ausgeführt werden, ist es möglich, den Dienst mit der bereits verwendeten Software zu verwalten / überwachen.
Schließlich gibt es keine
make
Abhängigkeiten. Mit anderen Worten, eine einfachenpm install -g node-windows
wird funktionieren. Sie benötigen keine Visual Studio-, .NET- oder Node-Gyp-Magie, um dies zu installieren. Außerdem ist es MIT- und BSD-lizenziert.Bei vollständiger Offenlegung bin ich der Autor dieses Moduls. Es wurde entwickelt, um die genauen Schmerzen des OP zu lindern, aber mit einer engeren Integration in die Funktionalität, die das Betriebssystem bereits bietet. Ich hoffe, zukünftige Zuschauer mit derselben Frage finden es nützlich.
quelle
UPDATE : Ich habe aktualisiert, um das Neueste von pm2 aufzunehmen:
Für viele Anwendungsfälle ist die Verwendung eines systemd-Dienstes die einfachste und am besten geeignete Methode zum Verwalten eines Knotenprozesses. Für diejenigen, die zahlreiche Knotenprozesse oder unabhängig voneinander ausgeführte Knoten-Mikrodienste in einer einzigen Umgebung ausführen, ist pm2 ein umfassenderes Tool.
https://github.com/unitech/pm2
http://pm2.io
pm2 monit
oder Prozessliste mitpm2 list
pm2 logs
quelle
Wenn Sie das Skript einfach bis zum Abschluss ununterbrochen ausführen möchten, können Sie es
nohup
wie bereits in den Antworten hier erwähnt verwenden. Keine der Antworten enthält jedoch einen vollständigen Befehl, der auchstdin
und protokolliertstdout
.>>
Mittel hängen anapp.log
.2>&1
stellt sicher, dass Fehler auch an die gesendetstdout
und hinzugefügt werdenapp.log
.&
stellt sicher, dass Ihr aktuelles Terminal vom Befehl getrennt ist, damit Sie weiterarbeiten können.Wenn Sie einen Knotenserver ausführen möchten (oder etwas, das beim Neustart des Servers wieder gestartet werden soll), sollten Sie systemd / systemctl verwenden .
quelle
Wenn Sie OSX ausführen, können Sie einen echten Systemprozess am einfachsten erstellen
launchd
, indem Sie ihn starten.Erstellen Sie eine solche Liste und fügen Sie sie mit dem Namen in die / Library / LaunchDaemons ein
top-level-domain.your-domain.application.plist
(Sie müssen beim Platzieren root sein):Wenn Sie fertig sind, geben Sie Folgendes aus (als root):
und du rennst.
Und Sie werden nach einem Neustart immer noch ausgeführt.
Weitere Optionen in der Liste finden Sie auf der Manpage hier: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html
quelle
Versuchen Sie, diesen Befehl auszuführen, wenn Sie nohup verwenden -
Sie können den Server auch für immer starten
PM2 unterstützt auch
npm start
quelle
pm2 start npm -- start
Ich benutze einfach das Daemon npm Modul:
In letzter Zeit verwende ich auch mon (1) von TJ Holowaychuk , um einfache Knoten-Apps zu starten und zu verwalten.
quelle
Ich benutze Supervisor für die Entwicklung. Es funktioniert einfach. Wann immer Sie Änderungen an einer .js-Datei vornehmen, startet Supervisor Ihre App automatisch mit diesen geladenen Änderungen neu.
Hier ist ein Link zu seiner Github-Seite
Installieren :
Mit -e können Sie ganz einfach andere Erweiterungen anzeigen lassen. Ein anderer Befehl, den ich oft benutze, ist -i, um bestimmte Ordner zu ignorieren.
Sie können nohup und Supervisor verwenden, um Ihre Knoten-App auch nach dem Abmelden im Hintergrund auszuführen.
quelle
Node.js als Hintergrunddienst in WINDOWS XP
Installation:
Erstellen Sie c: \ node \ helloworld.js
Öffnen Sie die Befehlskonsole und geben Sie Folgendes ein (setx nur, wenn Resource Kit installiert ist)
Ein nützlicher Batch-Goodie ist das Erstellen von c: \ node \ ServiceMe.cmd
Service-Management:
quelle
Die akzeptierte Antwort ist wahrscheinlich die beste Produktionsantwort, aber für einen schnellen Hack, der Entwicklungsarbeit leistet, habe ich Folgendes gefunden:
nodejs scriptname.js &
hat nicht funktioniert, weil nodejs das & zu verschlingen schien, und so ließ mich das Ding das Terminal nicht weiter benutzen, ohne dass scriptname.js starb.Aber ich habe
nodejs scriptname.js
eine .sh-Datei eingefügt undnohup sh startscriptname.sh &
gearbeitet.Auf jeden Fall keine Produktionssache, aber es löst das Problem "Ich muss mein Terminal weiter verwenden und möchte nicht 5 verschiedene Terminals starten".
quelle
Wenn Sie NodeJS auf einem Linux-Server ausführen, ist dies meiner Meinung nach der beste Weg.
Erstellen Sie ein Service-Skript und kopieren Sie es in /etc/init/nodejs.conf
Dienst starten: sudo service nodejs start
Dienst beenden: sudo service nodejs stop
Service-Skript
quelle
Juni 2017 Update:
Lösung für Linux: (Red Hat). Vorherige Kommentare funktionieren bei mir nicht. Dies funktioniert für mich bei Amazon Web Service - Red Hat 7. Ich hoffe, dies funktioniert für jemanden da draußen.
quelle
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
was es tut. Können Sie mir bitte mehr Details geben? Ich bin nicht sicher , aber ich denke , es Verkehr umleitet aus80
zu8080
dem Knoten Server Streams, nicht wahr?Verwenden Sie nssm, die beste Lösung für Windows. Laden Sie einfach nssm herunter , öffnen Sie cmd im Verzeichnis nssm und geben Sie ein
Dadurch wird ein neuer Windows-Dienst installiert, der unter services.msc aufgeführt wird. Von dort aus können Sie den Dienst starten oder stoppen. Dieser Dienst wird automatisch gestartet und Sie können den Neustart konfigurieren, wenn er fehlschlägt.
quelle
Um die verschiedenen vorgeschlagenen Optionen abzurunden, gibt es noch einen: den
daemon
Befehl in GNU / Linux, über den Sie hier lesen können: http://libslack.org/daemon/manpages/daemon.1.html . (Entschuldigung, wenn dies bereits in einem der obigen Kommentare erwähnt wurde).quelle
Schauen Sie sich die Fuge an! Abgesehen davon, dass Sie viele Worker starten, können Sie auch Ihren Knotenprozess dämonisieren!
http://github.com/pgte/fugue
quelle
Hat jemand einen trivialen Fehler in der Position von "2> & 1" bemerkt?
sollte sein
quelle
Ich verwende tmux für eine Entwicklungsumgebung mit mehreren Fenstern / Fenstern auf Remote-Hosts. Es ist wirklich einfach, den Prozess zu trennen und im Hintergrund laufen zu lassen. Schauen Sie sich tmux an
quelle
Für Benutzer neuerer Versionen des Daemon npm-Moduls müssen Sie Dateideskriptoren anstelle von Zeichenfolgen übergeben:
quelle
PM2 ist ein Produktionsprozessmanager für Node.js-Anwendungen mit integriertem Load Balancer. Sie können Anwendungen für immer am Leben erhalten, sie ohne Ausfallzeiten neu laden und allgemeine Systemadministrationsaufgaben vereinfachen. https://github.com/Unitech/pm2
quelle
Ich bin überrascht, dass niemand Guvnor erwähnt hat
Ich habe es für immer versucht, pm2 usw. Aber wenn es um solide Kontrolle und webbasierte Leistungsmetriken geht, habe ich festgestellt, dass Guvnor bei weitem das Beste ist. Außerdem ist es vollständig OpenSource.
Bearbeiten: Ich bin mir jedoch nicht sicher, ob es unter Windows funktioniert. Ich habe es nur unter Linux verwendet.
quelle
Da mir diese Option in der Liste der bereitgestellten Antworten fehlt, möchte ich ab 2020 eine geeignete Option hinzufügen: Docker oder eine gleichwertige Containerplattform . Neben der Sicherstellung, dass Ihre Anwendung in einer stabilen Umgebung funktioniert, bieten sich zusätzliche Sicherheitsvorteile sowie eine verbesserte Portabilität.
Es gibt Docker-Unterstützung für Windows, MacOS und die meisten / großen Linux-Distributionen. Die Installation von Docker auf einer unterstützten Plattform ist recht einfach und gut dokumentiert. Das Einrichten einer Node.js-Anwendung ist so einfach wie das Einfügen in einen Container und das Ausführen dieses Containers, während sichergestellt wird, dass er nach dem Herunterfahren neu gestartet wird.
Container-Image erstellen
Angenommen, Ihre Anwendung ist in / home / me / my-app auf diesem Server verfügbar , erstellen Sie eine Textdatei Dockerfile im Ordner / home / me / my-app mit ähnlichen Inhalten:
Erstellen Sie das Bild mit dem folgenden Befehl:
Hinweis: Der letzte Parameter wählt den Ordner aus, der diese Docker-Datei anstelle der Docker-Datei selbst enthält. Sie können mit der Option -f eine andere auswählen .
Container starten
Verwenden Sie diesen Befehl zum Starten des Containers:
Dieser Befehl setzt voraus, dass Ihre App Port 3000 überwacht und Sie möchten, dass sie auf Port 80 Ihres Hosts verfügbar gemacht wird.
Dies ist sicherlich ein sehr begrenztes Beispiel, aber es ist ein guter Ausgangspunkt.
quelle
Wenn Sie pm2 verwenden, können Sie es mit
autorestart
set to verwendenfalse
:Dadurch wird ein Beispiel generiert
ecosystem.config.js
:quelle
Diese Antwort ist für die Partei ziemlich spät, aber ich fand, dass die beste Lösung darin bestand, ein Shell-Skript zu schreiben, das sowohl die Befehle als auch die Befehle
screen -dmS
und verwendetnohup
.Ich füge auch das
>> logfile
Bit am Ende hinzu, damit ich die Knotenanweisungen einfach speichern kannconsole.log()
.Warum habe ich ein Shell-Skript verwendet? Nun, ich habe auch eine if-Anweisung hinzugefügt, die überprüft, ob der
node myserver.js
Prozess bereits ausgeführt wurde.Auf diese Weise konnte ich eine einzelne Befehlszeilenoption erstellen, mit der ich den Server am Laufen halten und neu starten kann, wenn ich Änderungen vorgenommen habe, was für die Entwicklung sehr hilfreich ist.
quelle