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!

59voto

Xeoncross Punkte 53024

Wenn Sie das Skript einfach ohne Unterbrechung laufen lassen wollen, bis es fertig ist, können Sie nohup wie bereits in den Antworten hier erwähnt. Allerdings bietet keine der Antworten einen vollständigen Befehl, der auch protokolliert stdin y stdout .

nohup node index.js >> app.log 2>&1 &
  • Le site >> bedeutet Anhängen an app.log .
  • 2>&1 sorgt dafür, dass Fehler auch an stdout und in die app.log .
  • Das Ende & stellt sicher, dass Ihr aktuelles Terminal vom Befehl getrennt ist, damit Sie weiterarbeiten können.

Wenn Sie einen Node-Server betreiben wollen (oder etwas, das nach dem Neustart des Servers wieder starten soll), sollten Sie systemd / systemctl .

32voto

Hutch Punkte 9842

UPDATE : Ich habe die neueste Version von pm2 aktualisiert:

Für viele Anwendungsfälle ist die Verwendung eines systemd-Dienstes der einfachste und geeignetste Weg, einen Node-Prozess zu verwalten. Für diejenigen, die zahlreiche Node-Prozesse oder unabhängig laufende Node-Microservices in einer einzigen Umgebung betreiben, ist pm2 ein umfassenderes Tool.

https://github.com/unitech/pm2

http://pm2.io

  • es hat eine wirklich nützliche Überwachungsfunktion -> hübsches 'gui' für die Kommandozeilenüberwachung von mehreren Prozessen mit pm2 monit oder Prozessliste mit pm2 list
  • organisierte Log-Verwaltung -> pm2 logs
  • andere Dinge:

    • Verhaltenskonfiguration
    • Unterstützung von Quellkarten
    • PaaS-kompatibel
    • Beobachten & Nachladen
    • Modul-System
    • Maximale Speicheraufladung
    • Cluster-Modus
    • Heißes Nachladen
    • Arbeitsablauf bei der Entwicklung
    • Startup-Skripte
    • Automatische Vervollständigung
    • Arbeitsablauf bei der Bereitstellung
    • Keymetrics-Überwachung
    • API

29voto

Himanshu Teotia Punkte 1805

Versuchen Sie, diesen Befehl auszuführen, wenn Sie nohup verwenden -

nohup npm start 2>/dev/null 1>/dev/null&

Sie können auch forever verwenden, um den Server zu starten

forever start -c "npm start" ./ 

PM2 unterstützt außerdem npm start

pm2 start npm -- start

4 Stimmen

Vielen Dank, das hat perfekt funktioniert. pm2 start npm -- start

0 Stimmen

Danke, ich benutze NestJS, also habe ich versucht, es auszuführen: [forever start -c "npm run start" ./] und es funktionierte wirklich gut!

22voto

Lars Christensen Punkte 221

Wenn Sie OSX verwenden, dann ist der einfachste Weg, einen echten Systemprozess zu erzeugen, die Verwendung von launchd um sie zu starten.

Erstellen Sie eine plist wie diese, und legen Sie sie im Verzeichnis /Library/LaunchDaemons mit dem Namen top-level-domain.your-domain.application.plist (Sie müssen Root sein, wenn Sie es platzieren):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>top-level-domain.your-domain.application</string>

    <key>WorkingDirectory</key>
    <string>/your/preferred/workingdirectory</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/node</string>
        <string>your-script-file</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

</dict>
</plist>

Danach geben Sie dies (als Root) aus:

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application

und Sie sind auf der Flucht.

Und nach einem Neustart sind Sie immer noch im Rennen.

Weitere Optionen in der plist finden Sie in der Manpage hier: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html

0 Stimmen

Unter welchem Benutzer wird der Dienst ausgeführt? Gibt es eine Möglichkeit, den Benutzer festzulegen?

14voto

LoG Punkte 1131

Ich verwende einfach die Daemon npm-Modul:

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // Your Application Code goes here
});

In letzter Zeit benutze ich auch mon(1) de TJ Holowaychuk um einfache Knotenanwendungen zu starten und zu verwalten.

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