663 Stimmen

Wie kann ich eine node.js-Anwendung als Hintergrunddienst ausführen?

Da dieser Beitrag im Laufe der Jahre viel Aufmerksamkeit erregt hat, habe ich die besten Lösungen für jede Plattform am Ende dieses Beitrags aufgelistet.


Originalpfosten :

Ich möchte, dass mein Node.js-Server im Hintergrund läuft, d. h.: Wenn ich mein Terminal schließe, soll mein Server weiterlaufen. Ich habe dies gegoogelt und kam mit diesem Lehrgang Es funktioniert jedoch nicht wie vorgesehen. Statt dieses Daemon-Skript zu verwenden, dachte ich, ich benutze einfach die Ausgabeumleitung (die 2>&1 >> file Teil), aber auch dieser wird nicht beendet - ich erhalte eine leere Zeile in meinem Terminal, als ob es auf Ausgaben/Fehler wartet.

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 also weiterlaufen lassen, wenn ich meinen lokalen Computer herunterfahre?


Top-Lösungen :

3 Stimmen

Ich glaube, er wollte sein lokales System abschalten.

67 Stimmen

Er meinte, dass das Beenden einer ssh-Sitzung die Aufgabe beendet

6 Stimmen

github.com/Unitech/pm2 ist ein sehr gepflegter und sehr stabiler Prozessmanager, probieren Sie ihn aus!

614voto

mikemaccana Punkte 93077

Ich kopiere meine eigene Antwort von Wie kann ich eine Node.js-Anwendung als eigenen Prozess ausführen?

2015 Antwort : Fast jede Linux-Distribution wird mit systemd ausgeliefert, was bedeutet forever, monit, PM2, etc. sind nicht mehr notwendig - Ihr Betriebssystem erledigt diese Aufgaben bereits .

Machen Sie eine myapp.service Datei (wobei Sie "myapp" natürlich durch den Namen Ihrer Anwendung ersetzen):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Beachten Sie, wenn Sie neu in Unix sind: /var/www/myapp/app.js haben sollen #!/usr/bin/env node in der allerersten Zeile und schalten Sie den ausführbaren Modus ein chmod +x myapp.js .

Kopieren Sie Ihre Servicedatei in das Verzeichnis /etc/systemd/system .

Beginnen Sie es mit systemctl start myapp .

Aktivieren Sie die Ausführung beim Booten mit systemctl enable myapp .

Siehe Protokolle mit journalctl -u myapp

Dies ist entnommen aus Wie wir Node-Apps unter Linux bereitstellen, Ausgabe 2018 die auch Befehle zur Erstellung einer AWS/DigitalOcean/Azure CloudConfig zum Aufbau von Linux/Knoten-Servern enthält (einschließlich der .service Datei).

8 Stimmen

Upstart , wenn verfügbar, ist auch eine gute Lösung. So oder so, Sie sollten sich nicht auf einen nodejs-Prozess verlassen, um Ihren nodejs-Daemon am Laufen zu halten. Dies ist eine Aufgabe für das Betriebssystem allein. killall nodejs und für immer ist weg....

26 Stimmen

Beachten Sie, dass es auch möglich ist, systemd-Dienste als Benutzer auszuführen. Siehe zum Beispiel diese Anleitung . Sie können Ihre Servicedatei in ~/.config/systemd/user beginnen Sie es mit systemctl --user start myapp aktivieren Sie es mit systemctl --user enable myapp .

8 Stimmen

Vielen Dank für diese Antwort. Dies ist, was ich will rein und klar

256voto

NG. Punkte 21987

UPDATE - Wie in einer der Antworten unten erwähnt, PM2 hat einige wirklich schöne Funktionen, die für immer fehlen. Erwägen Sie, es zu verwenden.

Original-Antwort

Utilisez nohup :

nohup node server.js &

エディテージ Ich wollte hinzufügen, dass die akzeptierte Antwort wirklich der richtige Weg ist. Ich verwende forever für Instanzen, die oben bleiben müssen. Ich mag zu tun npm install -g forever so dass es im Knotenpfad steht, und dann machen Sie einfach forever start server.js

157 Stimmen

Coolen Teil zu wissen: nohup steht für no hangup Das stammt noch aus den alten Zeiten, als man einen Prozess am Leben erhalten wollte, wenn man sein Modem "aufhängt".

1 Stimmen

Heutzutage ist es eher der Name des Signals 1, das Prozesse empfangen, um zu warnen, dass der Benutzer die Shell geschlossen hat (oder die Modemverbindung verloren hat, natürlich :P)

7 Stimmen

Es ist nicht die beste Lösung, denn wenn die Anwendung auf einen nicht abgefangenen Fehler stößt, wird der Knotenprozess beendet und nicht neu gestartet. Dennoch ist es eine vernünftige Option für die Entwicklung.

249voto

muzz Punkte 4284

Sie können Forever verwenden, ein einfaches CLI-Tool, um sicherzustellen, dass ein bestimmtes Node-Skript kontinuierlich (d.h. für immer) ausgeführt wird: https://www.npmjs.org/package/forever

6 Stimmen

Mit dem neuesten Node konnte ich es nicht dazu bringen, eine App über den Skriptnamen zu stoppen (Fehler) - auch - generell Fehlverhalten (war auf OS-X) - alle aus dem Quellcode gebaut, seltsam. Links Dinge in einem schlechten Zustand, hat mich nicht mit Vertrauen zu füllen.

4 Stimmen

Während nohup den Trick erfüllt, ist forever eine bessere Lösung, da es den Prozess dämonisiert. Tolles Werkzeug!

5 Stimmen

Eine einfachere Anleitung finden Sie übrigens hier: Einen node.js-Server mit Forever aufrechterhalten

78voto

Brent Punkte 22596

Das ist vielleicht nicht der übliche Weg, aber ich mache das mit dem Bildschirm, vor allem in der Entwicklungsphase, weil ich ihn dann wieder hochfahren und bei Bedarf daran herumspielen kann.

screen
node myserver.js
>>CTRL-A then hit D

Der Bildschirm löst sich und überlebt die Abmeldung. Dann können Sie ihn mit screen -r wiederherstellen. Im Handbuch zum Bildschirm finden Sie weitere Details. Du kannst die Bildschirme benennen, wenn du willst.

3 Stimmen

Auch tmux ist gut. Funktioniert wie screen (CTRL-B ist Standard anstelle von CTRL-A, ist aber konfigurierbar). Tmux hat Panels (geteilte Bildschirme).

0 Stimmen

Ich benutze dies seit ein paar Wochen für eine Meteor-App. $screen -dr' für das Lösen und Wiederanbringen könnte gelegentlich erforderlich sein.

0 Stimmen

Für mich ist das der einfachste Weg, die Arbeit zu erledigen. Aber ich stimme zu, nicht die beste Lösung

73voto

Corey Punkte 4923

Update 2016: Die node-Windows/mac/linux-Reihe verwendet eine gemeinsame API für alle Betriebssysteme und ist daher eine absolut relevante Lösung. Allerdings erzeugt node-linux systemv-Init-Dateien. Da systemd immer beliebter wird, ist es unter Linux realistischerweise die bessere Option. PRs sind willkommen, wenn jemand systemd-Unterstützung zu node-linux hinzufügen möchte :-)

Ursprüngliches Thema:

Dieses Thema ist schon ziemlich alt, aber node-Windows bietet eine weitere Möglichkeit, Hintergrunddienste unter Windows zu erstellen. Sie basiert lose auf dem nssm Konzept der Verwendung eines exe Wrapper um Ihr Node-Skript. Es verwendet jedoch winsw.exe und bietet einen konfigurierbaren Node Wrapper, der eine genauere Kontrolle darüber ermöglicht, wie der Prozess bei Fehlern startet/stoppt. Diese Prozesse sind wie jeder andere Dienst verfügbar:

enter image description here

Das Modul bietet auch eine Ereignisprotokollierung:

enter image description here

Die Daemonisierung Ihres Skripts wird durch Code erreicht. Zum Beispiel:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\my\\node\\script.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

// Listen for the "start" event and let us know when the
// process has actually started working.
svc.on('start',function(){
  console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.');
});

// Install the script as a service.
svc.install();

Das Modul unterstützt Dinge wie die Begrenzung von Neustarts (damit schlechte Skripte Ihren Server nicht verwüsten) und wachsende Zeitintervalle zwischen Neustarts.

Da node-Windows-Dienste wie alle anderen Dienste laufen, können Sie den Dienst mit der Software verwalten/überwachen, die Sie bereits verwenden.

Schließlich gibt es keine make Abhängigkeiten. Mit anderen Worten, ein einfaches npm install -g node-windows wird funktionieren. Sie brauchen kein Visual Studio, .NET oder Node-Gyp-Magie, um es zu installieren. Außerdem ist es MIT und BSD lizenziert.

Um ganz offen zu sein: Ich bin der Autor dieses Moduls. Es wurde entwickelt, um genau den Schmerz zu lindern, den der OP erlebt hat, aber mit einer engeren Integration in die Funktionen, die das Betriebssystem bereits bietet. Ich hoffe, dass künftige Betrachter mit der gleichen Frage es nützlich finden.

11 Stimmen

Ich habe dies nun auf node-mac und bietet die gleiche Funktionalität unter OSX.

1 Stimmen

Ich bin an den Punkt gekommen, ein paar Node-Programme zu planen und stehe vor einer Entscheidung, Node-Windows, Forever oder Kue zu wählen. Ich tendiere zu node-Windows, würde aber gerne verstehen, warum ich nicht Forever oder Kue verwenden sollte, wenn ich ein Dutzend Node-Programme planen und überwachen möchte. Einige laufen ewig. Sie müssen auch überwacht werden.

6 Stimmen

Node-Windows verwendet das systemeigene Betriebssystem für die Verwaltung von Hintergrunddiensten und das systemeigene Ereignisprotokoll für die Protokollierung. Forever hat seine eigene benutzerdefinierte Überwachung und Protokollierung. Ich habe einen Artikel darüber geschrieben unter medium.com/p/2a602ea657a2 Es hört sich so an, als müssten Sie Ihre Skripte planen und sie nicht ständig als Hintergrunddienste laufen lassen. Projekte wie Kue und Agenda sind für diesen Zweck konzipiert. Node-Windows & Forever dienen einem anderen Zweck.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X