Wie laufen Node.js als hintergrund-Prozess und niemals sterben?
Ich eine Verbindung zum linux-server per putty SSH. Ich habe versucht zu laufen als hintergrund-Prozess wie diesem:
$ node server.js &
Jedoch nach 2,5 STD das terminal inaktiv ist, und der Prozess stirbt. Gibt es trotzdem kann ich den Prozess lebendig, auch mit dem terminal getrennt?
Bearbeiten 1
Tatsächlich, ich habe versucht nohup
, aber sobald ich in der Nähe der Putty-SSH-terminal oder ziehen Sie meine internet-der server-Prozess beendet sich sofort.
Ist es etwas, was ich zu tun habe in Putty?
Edit 2 (auf Feb, 2012)
Es ist ein node.js
Modul, für immer. Es wird laufen node.js server als daemon service.
- In meinem Fall nohup funktioniert, wenn ich die Ausfahrt Terminal durch Eingabe
exit
. Wenn ich das Putty-Fenster einfach schließen, es schlägt fehl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfache Lösung (wenn Sie nicht interessiert sind, kommen Sie zurück zu dem Prozess, will ihn am laufen zu halten):
Leistungsstarke Lösung (ermöglicht es Ihnen, wiederherstellen, um den Prozess, wenn es interaktiv ist):
Können Sie dann trennen Sie Sie durch drücken von Strg+a+d und dann hängen Sie wieder durch ausführen von
screen -r
Beachten Sie auch die neuere alternative zu screen, tmux.
sudo bash
.nohup node server.js > /dev/null 2>&1 &
nohup
bedeutet: nicht beenden diesen Prozess, auch wenn die stty geschnittenoff.
> /dev/null
bedeutet: stdout geht nach /dev/null (das ist ein dummyGeräte, die nicht aufnehmen, keine Ausgabe).
2>&1
bedeutet: stderr geht auch an die Standardausgabe (das ist bereits weitergeleitet/dev/null
). Sie kann ersetzen &1 mit einem Dateipfad zu halten ein Protokoll der Fehler, z.B.:2>/tmp/myLog
&
am Ende bedeutet: führen Sie diesen Befehl als hintergrund-task.2>&1
genau bedeutet: stderr wird, wo stdout derzeit geht (was in diesem Fall/dev/null
).Dies erklärt, warum die stderr-Umleitung stehen hat nachdem die stdout umleiten./dev/null
? Schön loggen... auf Gut Glück versucht zu Debuggen...nohup node server.js &> /dev/null &
.&> file
entspricht> file 2>&1
plasmashell
Prozess hält bis zu werfen und ich interessiere mich nicht, die Ursache zu finden, gerade jetzt... So ist es einfach für mich zunohup kstart plasmashell > /dev/null 2>&1 &
weil ich don ' T care über die Protokollierung.Sollten Sie wirklich versuchen, zu verwenden
screen
. Es ist ein bisschen komplizierter, als einfach zu tunnohup long_running &
aber Verständnis Bildschirm, nachdem Sie die nie wieder kommen.Starten Sie Ihre screen-Sitzung zum ersten:
Führen Sie alles, was Sie wollen:
Drücken Sie Strg+A und dann d.... Getan. Ihre Sitzung läuft weiter im hintergrund.
Können Sie eine Liste aller Sitzungen, die von
screen -ls
und befestigen Sie einige vonscreen -r 20673.pts-0.srv
Befehl, wo 0673.pts-0.srv ist eine Liste.Dies ist eine alte Frage, aber ist hoher Rang auf Google. Ich kann fast nicht glauben, auf der höchsten stimmten die Antworten, da läuft ein node.js Prozess innerhalb einer screen-session, mit der
&
oder sogar mit dernohup
flag-alle von Ihnen-sind nur workarounds.Speziell der screen/tmux-Lösung, die sollte wirklich sein betrachtet eine amateur Lösung. Screen und Tmux sind nicht dazu gedacht, zu halten, die Prozesse laufen, aber für die multiplexing-terminal-Sitzungen. Es ist in Ordnung, wenn Sie ein Skript auf Ihren server, und trennen wollen. Aber für eine node.js server Ihr nicht wollen, dass Ihr Prozess angebracht werden, um eine terminal-Sitzung. Dies ist zu zerbrechlich. , Um die Dinge ausgeführt, die Sie brauchen, um daemonize den Prozess!
Gibt es viele gute tools, die das tun.
PM2: http://pm2.keymetrics.io/
Einen großen Vorteil sehe ich in der Bevorzugung von PM2 ist, dass es erzeugen kann, die den system-startup-Skript, um den Prozess weiterhin zwischen gestartet:
Wo
platform
werden kannubuntu|centos|redhat|gentoo|systemd|darwin|amazon
.forever.js: https://github.com/foreverjs/forever
Init-Skripte:
Bin ich nicht ins detail gehen, wie man ein init-Skript, weil ich bin nicht ein Experte in diesem Thema und es wäre zu lange für diese Antwort, aber im Grunde genommen sind einfache shell-Skripte, ausgelöst durch OS-Ereignisse. Lesen Sie mehr über dieses hier
Andockfenster:
Einfach Ihre server in einem Docker-container mit
-d
option und voilá, Sie haben eine daemonisierte node.js server!!!Hier ist ein Beispiel Dockerfile (aus node.js official guide):
Dann bauen Sie Ihr Bild und führen Sie Ihre container:
Hoffe, das hilft jemandem der Landung auf dieser Seite. Verwenden Sie immer das richtige Werkzeug für den job. Es wird sparen Sie eine Menge Kopfschmerzen und das über Stunden!
tail -f
ing der log-Datei, pm2 erzeugt.screen
Lösung, die viele Menschen finden nicht den job ist ein workaround. Es gibt viele Wege, die das erreichen einer bestimmten Aufgabe. Ich glaube, es passiert, dass (betrachten wir die spezifische Frage) es geschieht, um die Erreichung der spezifischen Aufgabe derrun as background and never die
vorzüglich für viele. Es hat auch den zusätzlichen bonus, der es dem Benutzer gestattet, zu gehen zurück in Ihr wieder zu interagieren und änderungen vornehmen, wenn er will. Die Schlüssel-Komponenten istbackground
undnever die
. Alle Lösungen haben bestimmte Boni.nohup
ist die Lösung. Es ist gebacken in Linux, und ist das, was es dort für. Es ist eine Linie, es ist sauber, und es funktioniert wie vorgesehen, jedes mal, unabhängig von updates. Die Menschen sollten wirklich versuchen zu vermeiden, die Verwendung von Drittanbieter-tools für grundlegende Anwendungsfälle wie diese. Das Andockfenster Beispiel (zum Beispiel) ist viel Ausführlicher und Ressourcen als die eines einfachen Befehl in der top-stimmten Antwort. Liebe Andockfenster, aber nicht für diese.nohup
Lösung nicht befriedigen, die "niemals sterben" - Anforderung. Es sei denn, Sie schreiben sehr schwierigtrap
oder hacky infinite loop, ich sehe nicht, wie, um den Prozess daemonisierte ohne die Verwendung von tools, die speziell geschrieben für diesen Zweck (oder ein init-Skript, geschrieben von sich selbst, natürlich).linux start process background
aber die Frage ist wirklich über einen Knoten, so habe ich vorgeschlagen, bei einer Bearbeitung der original-Titel.andere Lösung verleugnen die job
nohup
können das Programm weiterhin auch nach dem terminal stirbt. Ich hatte tatsächlich Situationen, in denennohup
verhindert, dass die SSH-Sitzung beenden korrekt, so sollten Sie umleiten von Eingabe-als auch:Je nachdem, wie
nohup
konfiguriert ist, müssen Sie möglicherweise auch die Umleitung der standard-Ausgabe und standard-Fehler-Dateien.Habe ich diese Funktion in meinem shell-rc-Datei, basierend auf @Yoichi Antwort:
Können Sie es auf diese Weise:
Nohup und screen bieten tolle Licht-Lösungen laufen Node.js in den hintergrund. Node.js Prozess manager (PM2) ist ein praktisches Werkzeug für die Bereitstellung. Installieren Sie es mit npm Global auf dem system:
npm install pm2 -g
ausführen Node.js app als daemon:
pm2 start app.js
Können Sie Optional einen link auf Keymetrics.io ein monitoring-SAAS-hergestellt von Unitech.
Es wird Befehl zum entfernen von active task-Liste und senden Sie den Befehl in den hintergrund
Haben, Lesen Sie über die nohup Befehl?
Ausführen-Befehl als service auf debian mit sysv-init:
Kopieren Skelett-Skript und passen Sie es für Ihre Bedürfnisse, wahrscheinlich alles, was Sie tun müssen, ist, um einige Variablen. Ihr Skript wird Erben feinen Standardwerte aus
/lib/init/init-d-script
, wenn etwas nicht passt Ihre Bedürfnisse - außer Kraft setzen in Ihrem Skript. Wenn etwas schief geht, können Sie details in der Quelle/lib/init/init-d-script
. Obligatorische varsDAEMON
undNAME
. Skript verwendetstart-stop-daemon
ausführen Ihren Befehl, inSTART_ARGS
Sie können zusätzliche Parameter definiert werden, derstart-stop-daemon
zu verwenden.Das ist, wie ich einige python-Sachen für meine wikimedia-wiki:
Neben der Einstellung vars, die ich hatte, zu überschreiben
do_stop_cmd
weil der python ersetzt die ausführbare Datei, so dass service hörte nicht richtig.Abgesehen von cool oben genannten Lösungen würde ich auch erwähnen über supervisord und monit-tools, die es erlauben, starten, überwachen Ihre Präsenz und starten Sie es, wenn es gestorben ist. Mit 'monit' Sie können auch einige aktive Prüfungen wie überprüfen Sie, ob Verfahren reagiert, die für die http-Anfrage
Für Ubuntu benutze ich dieses:
hinsichtlich
Versuchen, diese für eine einfache Lösung,
cmd & exit