it-swarm.com.de

Wie führe ich eine node.js-App als Hintergrunddienst aus?

Da dieser Beitrag über die Jahre viel Beachtung gefunden hat, habe ich die Top-Lösungen pro Plattform am Ende dieses Beitrags aufgelistet.


Originalbeitrag:

Ich möchte, dass mein node.js-Server im Hintergrund läuft, d. H .: wenn ich mein Terminal schließe, möchte ich, dass mein Server weiterläuft. Ich habe dies gegoogelt und mir dieses Tutorial ausgedacht, aber es funktioniert nicht wie beabsichtigt. Anstatt dieses Daemonskript zu verwenden, dachte ich, ich hätte nur die Ausgabeumleitung (den 2>&1 >> file-Teil) verwendet, aber auch dies wird nicht beendet.

Ich habe auch versucht, den Prozess in den Hintergrund zu stellen, aber sobald ich mein Terminal schließe, wird der Prozess ebenfalls abgebrochen.

Wie kann ich es also laufen lassen, wenn ich meinen lokalen Computer herunterfahre?


Top-Lösungen:

411
Peter Kruithof

Eigene Antwort kopieren aus Wie führe ich eine Node.js-Anwendung als eigenen Prozess aus?

2015 answer: Beinahe jede Linux-Distribution kommt mit systemd, dh forever, monit usw. sind nicht mehr erforderlich - Ihr Betriebssystem erledigt diese Aufgaben bereits.

Erstellen Sie eine myapp.service-Datei (offensichtlich ersetzen Sie "myapp" durch den Namen Ihrer App):

[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

Hinweis: Wenn Sie noch nicht mit Unix vertraut sind:/var/www/myapp/app.js sollte #!/usr/bin/env node in der ersten Zeile enthalten.

Kopieren Sie Ihre Servicedatei in den /etc/systemd/system

Starten Sie es mit systemctl start myapp

Ermöglicht die Ausführung beim Booten mit systemctl enable myapp.

Protokolle mit journalctl -u myapp anzeigen

Dies ist aus Wie setzen wir Knoten-Apps unter Linux, Ausgabe 2018 bereit, das auch Befehle zum Generieren von AWS/DigitalOcean/Azure CloudConfig zum Erstellen von Linux/Knotenservern (einschließlich der .service-Datei) enthält.

329
mikemaccana

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

233
muzz

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

Originalantwort

Verwenden Sie Nohup :

Nohup node server.js &

EDIT Ich wollte hinzufügen, dass die akzeptierte Antwort wirklich der richtige Weg ist. Ich benutze immer wieder Fälle, in denen man aufbleiben muss. Ich mache gerne npm install -g forever, also ist es im Knotenpfad und macht dann einfach forever start server.js

200
NG.

Dies ist möglicherweise nicht der akzeptierte Weg, aber ich mache es mit dem Bildschirm, vor allem während der Entwicklung, weil ich es wieder heraufbringen und wenn nötig mit ihm täuschen kann.

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

Der Bildschirm wird getrennt und überlebt, wenn Sie sich abmelden. Dann können Sie es mit Bildschirm -r zurückbekommen. Schlagen Sie im Bildschirmhandbuch nach, um weitere Informationen zu erhalten. Sie können den Bildschirmen einen Namen geben, wenn Sie möchten.

59
Brent

2016 Update: Die Node-Windows/Mac/Linux-Serie verwendet eine gemeinsame API für alle Betriebssysteme und ist daher eine absolut relevante Lösung. Jedoch; node-linux generiert systemv-init-Dateien. Da systemd immer beliebter wird, ist es unter Linux realistisch eine bessere Option. PR ist willkommen, wenn jemand systemd-Unterstützung zu node-linux hinzufügen möchte :-)

Ursprünglicher 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 eines exe-Wrappers für Ihr Knotenskript. Jedoch; Es verwendet stattdessen winsw.exe und bietet einen konfigurierbaren Node-Wrapper für eine genauere Kontrolle darüber, wie der Prozess bei Fehlern startet/stoppt. Diese Prozesse stehen wie jeder andere Dienst zur Verfügung:

enter image description here

Das Modul wird auch in einigen Ereignisprotokollen gebacken:

enter image description here

Das Daemonisieren Ihres Skripts erfolgt über Code. 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 das erneute Verkappen von Caps (dh Ihr Server wird nicht von fehlerhaften Skripts durchdrungen) und es werden immer mehr Zeitintervalle zwischen den Neustarts.

Da die node-windows-Dienste wie alle anderen ausgeführt werden, ist es möglich, den Dienst mit der von Ihnen bereits verwendeten Software zu verwalten.

Schließlich gibt es keine make Abhängigkeiten. Mit anderen Worten, ein einfacher npm install -g node-windows wird funktionieren. Sie benötigen kein Visual Studio, .NET oder Node-Gyp-Magic, um dies zu installieren. Es ist auch MIT und BSD lizenziert.

In vollem Umfang bin ich der Autor dieses Moduls. Es wurde entwickelt, um den genauen Schmerz zu reduzieren, den das OP erlebt hat, aber mit einer engeren Integration in die Funktionalität, die das Betriebssystem bereits bietet. Ich hoffe, dass zukünftige Zuschauer mit derselben Frage es nützlich finden.

58
Corey

UPDATE: Ich habe das neueste von pm2 aktualisiert:

in vielen Anwendungsfällen ist die Verwendung eines systemd-Dienstes die einfachste und geeignetste 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 Werkzeug.

https://github.com/unitech/pm2

http://pm2.io

  • es hat eine wirklich nützliche Überwachungsfunktion -> ziemlich 'gui' für die Befehlszeilenüberwachung mehrerer Prozesse mit pm2 monit oder Prozessliste mit pm2 list
  • organisiertes Protokollmanagement -> pm2 logs
  • andere Sachen:
    • Verhaltenskonfiguration
    • Quellkarten-Unterstützung
    • PaaS-kompatibel
    • Watch & Reload
    • Modulsystem
    • Max Speicher neu laden
    • Cluster-Modus
    • Heißes Nachladen
    • Entwicklungsworkflow
    • Startskripte
    • Autovervollständigung
    • Bereitstellungsworkflow
    • Keymetrics-Überwachung
    • API
25
Hutch

Wenn Sie OSX ausführen, ist der einfachste Weg, einen echten Systemprozess zu erstellen, die Verwendung von launchd, um ihn zu starten.

Erstellen Sie eine Plist wie diese und legen Sie sie in den Ordner/Library/LaunchDaemons mit dem Namen top-level-domain.your-domain.application.plist (Sie müssen root sein, wenn Sie sie 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>

Wenn Sie fertig sind, geben Sie Folgendes aus (als root):

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

und du rennst.

Nach einem Neustart laufen Sie immer noch.

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

16

Ich benutze einfach das 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 verwende ich auch mon (1) from TJ Holowaychuk , um einfache Knoten-Apps zu starten und zu verwalten.

13
LoG

Wenn Sie das Skript einfach ununterbrochen ausführen möchten, bis es abgeschlossen ist, können Sie nohop verwenden, wie bereits in den Antworten erwähnt. Keine der Antworten enthält jedoch einen vollständigen Befehl, der auch stdin und stdout protokolliert.

Nohup node index.js >> app.log 2>&1 &
  • Das >> bedeutet, an app.log anzuhängen.
  • 2>&1 stellt sicher, dass Fehler auch an stdout gesendet und zum app.log hinzugefügt werden.
  • Die Endung & 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 gesichert werden soll), sollten Sie systemd/systemctl verwenden. 

12
Xeoncross

Ich benutze Supervisor für die Entwicklung. Es funktioniert einfach. Wenn Sie Änderungen an einer JS-Datei vornehmen, startet Supervisor Ihre App automatisch mit den geladenen Änderungen.

Hier ist ein Link zu seiner Github-Seite

Installieren :

Sudo npm Supervisor installieren -g

Sie können es leicht machen, andere Erweiterungen mit -e anzusehen. Ein anderer Befehl, den ich häufig verwende, ist -i, um bestimmte Ordner zu ignorieren.

Mit Nohup und Supervisor können Sie Ihre Knoten-App auch nach dem Abmelden im Hintergrund ausführen.

Sudo Nohup Supervisor myapp.js &

12
Donald Gary

Versuchen Sie, diesen Befehl auszuführen, wenn Sie Nohup verwenden. 

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

Sie können den Server auch für immer verwenden 

forever start -c "npm start" ./ 

PM2 unterstützt auch npm start

pm2 start npm -- start
8
Himanshu Teotia

Node.js als Hintergrunddienst in WINDOWS XP

Installation:

  1. Installieren Sie WGET http://gnuwin32.sourceforge.net/packages/wget.htm über die ausführbare Installationsdatei
  2. Installieren Sie GIT http://code.google.com/p/msysgit/downloads/list über die ausführbare Installationsdatei
  3. Installieren Sie NSSM http://nssm.cc/download/?page=download , indem Sie nnsm.exe in den Ordner% windir%/system32 kopieren
  4. Erstellen Sie c:\node\helloworld.js

    // http://howtonode.org/hello-node
    var http = require('http');
    var server = http.createServer(function (request, response) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.end("Hello World\n");
    });
    server.listen(8000);
    console.log("Server running at http://127.0.0.1:8000/");
    
  5. Öffnen Sie die Befehlskonsole und geben Sie Folgendes ein (setx nur, wenn Resource Kit installiert ist)

    C:\node> set path=%PATH%;%CD%
    C:\node> setx path "%PATH%"
    C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules"
    C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt    
    C:\node> git clone --recursive git://github.com/isaacs/npm.git    
    C:\node> cd npm    
    C:\node\npm> node cli.js install npm -gf   
    C:\node> cd ..    
    C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js    
    C:\node> net start node-helloworld
    
  6. Ein geschickter Batch-Goodie ist das Erstellen von c:\node\ServiceMe.cmd

    @echo off
    nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1
    net start node-%~n1
    pause
    

Service-Management:

  • Die Dienste selbst sind jetzt über Start-> Ausführen -> Services.msc oder über Start-> Ausführen -> MSCONFIG-> Dienste verfügbar (und markieren Sie "Hide All Microsoft Services").
  • Jedem über das Batch-Skript erstellten Knoten wird das Skript mit 'Node-' vorangestellt.
  • Sie können auch in der Registrierung gefunden werden: "HKLM\SYSTEM\CurrentControlSet\Services\node-xxxx"
7
Page2PagePro

Die akzeptierte Antwort ist wahrscheinlich die beste Antwort auf die Produktion, aber für einen schnellen Hack, der Entwicklerarbeit erledigt, fand ich Folgendes:

nodejs scriptname.js & hat nicht funktioniert, weil nodejs das & zu verschlingen schien, und so ließ mich das Terminal nicht ohne Scriptname.js weiter benutzen.

Aber ich habe nodejs scriptname.js in eine .sh-Datei gestellt und Nohup sh startscriptname.sh & gearbeitet.

Auf keinen Fall eine Produktionssache, aber es löst das Problem "Ich muss mein Terminal weiter benutzen und möchte nicht 5 verschiedene Terminals starten".

7
ArtHare

Wenn Sie nodejs auf einem Linux-Server ausführen, denke ich, dass dies der beste Weg ist. 

Erstellen Sie ein Service-Skript und kopieren Sie es nach /etc/init/nodejs.conf

dienst starten: Sudo-Dienstknoten starten

dienst stoppen: Sudo-Dienstknotenjs wird angehalten

Sevice-Skript

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - [email protected]"

env USER="nodejs" #you have to create this user 
env APPNAME="nodejs" #you can change the service name
env WORKDIR="/home/<project-home-dir>" #set your project home folder here
env COMMAND="/usr/bin/node <server name>" #app.js ?

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

pre-start script
    Sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log
end script

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="<project-home-dir>"  #set your project home folder here
    export NODE_PATH="<project node_path>"

    #log file, grant permission to nodejs user
    exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

pre-stop script
    Sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log
end script
4
Pedro Muniz

Juni 2017 Update:
Lösung für Linux: (Red Hat). Vorherige Kommentare funktionieren für mich nicht .. Dies funktioniert bei Amazon Web Service - Red Hat 7.

A. Create the service file 
Sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target

[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/

[Install]
WantedBy=multi-user.target

B. Create a Shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
Sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start

then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)

C. Execute the Following

Sudo systemctl daemon-reload
Sudo systemctl start myapp
Sudo systemctl status myapp

(If there are no errors, execute below.  Autorun after server restarted.)
chkconfig myapp -add
3
Eman Jayme

verwenden Sie nssm die beste Lösung für Windows, laden Sie einfach nssm herunter, öffnen Sie cmd in das nssm - Verzeichnis und geben Sie ein

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

dadurch wird ein neuer Windows-Dienst installiert, der unter services.msc aufgelistet wird. Von dort aus können Sie den Dienst starten oder stoppen. Dieser Dienst wird automatisch gestartet, und Sie können den Neustart konfigurieren, falls er fehlschlägt.

3
Aun Rizvi

Um die verschiedenen vorgeschlagenen Optionen abzurunden, folgt noch eine weitere: der daemon-Befehl in GNU/Linux, den Sie hier lesen können: http://libslack.org/daemon/manpages/daemon.1.html (entschuldigt, wenn dies bereits in einem der obigen Kommentare erwähnt wurde).

2
ravi

hat jemand einen trivialen Fehler der Position "2> & 1" bemerkt?

2>&1 >> file

sollte sein 

>> file 2>&1
1
osexp2003

Schauen Sie sich die Fuge an! Neben dem Start vieler Arbeiter können Sie auch Ihren Knotenprozess verteufeln!

http://github.com/pgte/fugue

1
Shripad Krishna

Ich verwende tmux für eine Entwicklungsumgebung mit mehreren Fenstern/Fenstern auf Remote-Hosts. Es ist wirklich einfach, den Prozess zu lösen und im Hintergrund laufen zu lassen. Schauen Sie sich an tmux

1
Karl Pokus

Für Benutzer, die neuere Versionen des Moduls daemon npm verwenden, müssen Sie Dateibeschreibungen statt Zeichenfolgen übergeben:

var fs = require('fs');
var stdoutFd = fs.openSync('output.log', 'a');
var stderrFd = fs.openSync('errors.log', 'a');
require('daemon')({
    stdout: stdoutFd, 
    stderr: stderrFd
});
0
Viktor Nonov

PM2 ist ein Produktionsprozessmanager für Node.js-Anwendungen mit einem integrierten Lastenausgleich. Es ermöglicht Ihnen, Anwendungen für immer am Leben zu erhalten, sie ohne Ausfallzeiten neu zu laden und allgemeine Systemadministrationsaufgaben zu erleichtern. https://github.com/Unitech/pm2

0
Arezki Lebdiri

Ich bin überrascht, dass niemand erwähnt hat Guvnor

Ich habe ewig versucht, pm2 usw. Aber wenn es um solide Kontrolle und webbasierte Leistungskennzahlen geht, habe ich Guvnor gefunden, mit Abstand der Beste zu sein. Plus ist es auch voll OpenSource.

 enter image description here

Edit: Ich bin mir jedoch nicht sicher, ob es unter Windows funktioniert. Ich habe es nur unter Linux verwendet.

0
Josh

Diese Antwort ist für die Gruppe ziemlich spät, aber ich habe festgestellt, dass die beste Lösung darin bestand, ein Shell-Skript zu schreiben, das die Befehle screen -dmS und Nohup verwendet. 

screen -dmS newScreenName Nohup node myserver.js >> logfile.log

Ich füge auch das >> logfile-Bit am Ende hinzu, damit ich die Knoten console.log()-Anweisungen problemlos speichern kann. 

Warum habe ich ein Shell-Skript verwendet? Nun, ich habe auch eine if-Anweisung hinzugefügt, die überprüft hat, ob der node myserver.js-Prozess bereits läuft.

Auf diese Weise konnte ich eine einzige Befehlszeilenoption erstellen, mit der ich den Server aufrechterhalten und auch neu starten kann, wenn ich Änderungen vorgenommen habe, was für die Entwicklung sehr hilfreich ist.