Wie startet man einen node.js-Server als Daemon-Prozess?


83

In Python Twisted verfügen Sie über den twistdBefehl, der Sie bei einer Reihe von Aufgaben im Zusammenhang mit der Ausführung Ihrer Anwendung unterstützt (z. B. Dämonisierung).

Wie dämonisieren Sie einen node.js- Server, damit er auch nach dem Schließen der aktuellen Sitzung ausgeführt werden kann?

Danke für Ihre Hilfe


Antworten:


92

Für immer ist die Antwort auf Ihre Frage.

Installieren

$ curl https://npmjs.org/install.sh | sh
$ npm install forever
# Or to install as a terminal command everywhere:
$ npm install -g forever

Verwendung

Forever über die Befehlszeile verwenden

$ forever start server.js

Verwenden einer Instanz von Forever aus Node.js.

var forever = require('forever');

  var child = new forever.Forever('your-filename.js', {
    max: 3,
    silent: true,
    args: []
  });

  child.on('exit', this.callback);
  child.start();

7
Sollte die Option -g verwenden, um global zu installieren. Benötigt möglicherweise Berechtigungen, um dies zu tun.
Refaelio

1
Was passiert beim Neustart?

1
@AlexBrown - Sie müssen das forever start server.jszu einem Startskript hinzufügen (z. B. rc.local), wenn Sie möchten, dass es Neustarts überlebt.
UpTheCreek

3
Ich entschied mich schließlich dafür, Monit zu verwenden, um den Prozess für immer zu starten und zu stoppen.

7
für immer ist tot, pm2 ist der neue König. Bitte verschwenden Sie Ihre Zeit nicht für immer. Ich habe gerade gewechselt und bin umgehauen. pm2 kann Ihre App mit einem einfachen Lastausgleich auf allen Kernen durchführen. pm2 start app.js -i 0 --name "myapp" ... WOW ... probieren Sie es aus und Sie werden nicht für immer zurückblicken ... siehe @ Gary Bernitz Antwort
danday74

44

Wenn Sie Ihren Prozess benötigen, um sich selbst zu dämonisieren und nicht für immer weiterzuleiten, können Sie das Dämonisierungsmodul verwenden .

$ npm install daemonize2

Dann schreiben Sie einfach Ihre Serverdatei wie im Beispiel:

var daemon = require("daemonize2").setup({
    main: "app.js",
    name: "sampleapp",
    pidfile: "sampleapp.pid"
});

switch (process.argv[2]) {

    case "start":
        daemon.start();
        break;

    case "stop":
        daemon.stop();
        break;

    default:
        console.log("Usage: [start|stop]");
}

Wohlgemerkt, das ist eher ein Ansatz auf niedriger Ebene.


2
Dies klingt nach der korrekteren Antwort auf die Frage "So starten Sie den node.js-Server als Daemon".
Shyam Habarakada

2
Was fügst du in app.js ein? Es geht für mich einfach sofort aus.
Chovy

1
Was passiert beim Neustart?
Mixdev

case 'restart': daemon.on('stopped', () => { daemon.start(); }); daemon.stop(); break;
Davidhq

23

systemdSchreiben Sie eine Servicedatei, um einen Service Manager-Daemon zu starten . Erstellen Sie beispielsweise eine Datei /etc/systemd/system/myservice.service.

[Unit]
Description=myservice-description
After=network.target

[Service]
ExecStart=/opt/myservice-location/src/node/server.js --args=here
Restart=always
User=me
Group=group
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/opt/myservice-location

[Install]
WantedBy=multi-user.target

Denken Sie daran, den Service Manager-Daemon nach jeder Änderung an der Datei myservice.service zu aktualisieren.

$ systemctl daemon-reload

Starten Sie dann den Dienst und aktivieren Sie den Dienst beim Booten.

$ systemctl start myservice
$ systemctl enable myservice

1
Wo legen Sie in diesem Fall die zusätzlichen Argumente für die Datei server.js ab?
Nikita Fuchs

19

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 Knotenmikroservices in einer einzigen Umgebung ausführen, ist pm2 ein umfassenderes Tool.

https://github.com/unitech/pm2

http://pm2.io

  • Es hat eine wirklich nützliche Überwachungsfunktion -> hübsche 'GUI' für die Befehlszeilenüberwachung mehrerer Prozesse mit pm2 monitoder Prozessliste mitpm2 list
  • organisierte Protokollverwaltung -> pm2 logs
  • andere Sachen:
    • Verhaltenskonfiguration
    • Unterstützung der Quellkarte
    • PaaS-kompatibel
    • Anschauen & Nachladen
    • Modulsystem
    • Maximales Neuladen des Speichers
    • Cluster-Modus
    • Hot Reload
    • Entwicklungsworkflow
    • Startskripte
    • Automatische Vervollständigung
    • Bereitstellungsworkflow
    • Keymetrics-Überwachung
    • API

2
für immer ist tot, pm2 ist König! Ich benutze es seit Ewigkeiten, habe aber gerade auf pm2 umgestellt. BEEINDRUCKEND! BEEINDRUCKEND! BEEINDRUCKEND! Läuft Ihre App für immer auf einem Kern, pm2 kann das Gleiche tun ODER es kann Ihre App auf allen verfügbaren Kernen ausgleichen. BEEINDRUCKEND! @reboot-Cron-Jobs sind nicht erforderlich. Führen Sie einfach den Start von pm2 durch (um pm2 als systemd oder OS-äquivalenten Dienst zu starten) und speichern Sie dann pm2. Jetzt neu starten und Ihre Apps laufen noch. Sie können den Status einer laufenden App mit pm2 show abrufen. Uhr ist leicht verfügbar. BEEINDRUCKEND! unglaublich WOW!
danday74

Das Einrichten von pm2 für Nicht-Root-Benutzer in OpenShift ist zu schmerzhaft.
karthik101

12

Der einfachste Ansatz wäre, den Befehl nur in den Hintergrund zu senden.

$ node server.js &

Dann können Sie den Prozess zu einem späteren Zeitpunkt beenden. Normalerweise mache ich Folgendes:

$ killall node

Hinweis : Ich verwende OS X.


50
Beachten Sie, dass dies nicht funktioniert, wenn Sie sich von Ihrer Terminal- / SSH-Sitzung abmelden. Die vollständige Lösung dafür ist nohup node server.js> / dev / null 2> & 1 &
Michael Dillon

@MichaelDillon Warum sollte die Umleitung von Ausgaben /dev/nullin die vollständige Lösung enthalten sein?
Nurettin

6

Du kannst es versuchen:

$ nohup node server.js &

Es funktioniert für mich unter Mac und Linux.

Die Ausgabe erfolgt in der ./nohup.out Datei

Ich empfehle jedoch weiterhin die Verwendung von pm2oder forever, da sie leicht zum Neustarten, Stoppen und Protokollieren verwendet werden können.


3

Es gibt fortgeschrittenere Allzweckläufer wie monitund runit.


0

Für den Hintergrund zur normalen Dämonisierung auf einem POSIX-System können Sie nach der C-Methode suchen.

Ich habe nicht genügend Methoden in der node.js-API gesehen, um dies von Hand auf C-Weise durchführen zu können. Wenn Sie jedoch child_process verwenden, können Sie node.js dies für Sie tun lassen:

http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

Ich halte dies für eine potenzielle Zeitverschwendung, da die Wahrscheinlichkeit groß ist, dass Ihr System dasselbe bietet.

Beispielsweise:

http://libslack.org/daemon/manpages/daemon.1.html

Wenn Sie etwas Tragbares (plattformübergreifend) möchten, bieten die anderen Beiträge Lösungen an, die möglicherweise ausreichen.

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.