503 Stimmen

Wie lässt man Node.js als Hintergrundprozess laufen und stirbt nicht?

Ich verbinde mich mit dem Linux-Server über putty SSH. Ich habe versucht, ihn als Hintergrundprozess wie folgt auszuführen:

$ node server.js &

Nach 2,5 Stunden wird das Terminal jedoch inaktiv und der Prozess bricht ab. Kann ich den Prozess irgendwie am Leben erhalten, auch wenn das Terminal nicht angeschlossen ist?


Bearbeiten 1

Eigentlich habe ich versucht nohup aber sobald ich das Putty-SSH-Terminal schließe oder den Internetzugang unterbreche, wird der Serverprozess sofort beendet.

Muss ich in Putty irgendetwas tun?


Bearbeiten 2 (am Feb, 2012)

Es gibt eine node.js Modul, für immer . Der Node.js-Server wird als Daemon-Dienst ausgeführt.

8 Stimmen

In meinem Fall funktioniert nohup, wenn ich Terminal durch Eingabe von exit . Wenn ich nur das Putty-Fenster schließe, schlägt es fehl.

1162voto

Yoichi Punkte 12113

nohup node server.js > /dev/null 2>&1 &

  1. nohup bedeutet: Brechen Sie diesen Vorgang nicht ab, auch wenn der Stty durchtrennt ist abgeschaltet wird.
  2. > /dev/null bedeutet: stdout geht an /dev/null (ein Dummy für Gerät, das keine Ausgaben aufzeichnet).
  3. 2>&1 bedeutet: stderr geht auch an stdout (das bereits an /dev/null ). Sie können &1 durch einen Dateipfad ersetzen, um ein Fehlerprotokoll zu führen, z.B.: 2>/tmp/myLog
  4. & am Ende bedeutet: führen Sie diesen Befehl als Hintergrundaufgabe aus.

52 Stimmen

Dies sollte die akzeptierte Antwort sein, weil sie von viel höherer Qualität ist als die derzeit akzeptierte.

2 Stimmen

@L0j1k fraglich, OP hat ein Niveau des Verständnisses gezeigt, dass wenig weitere Erklärung für die akzeptierte Antwort erforderlich ist.

43 Stimmen

SO geht es nicht so sehr um den Auftraggeber, sondern vielmehr um die Tausenden von Menschen, die auf die Frage des Auftraggebers hin Hilfe suchen.

533voto

MK. Punkte 32324

Einfache Lösung (wenn Sie nicht daran interessiert sind, zu dem Prozess zurückzukehren, sondern ihn einfach weiterlaufen lassen wollen):

nohup node server.js &

Außerdem gibt es die jobs um eine indizierte Liste dieser Prozesse im Hintergrund anzuzeigen. Und Sie können einen Prozess im Hintergrund beenden, indem Sie kill %1 o kill %2 wobei die Nummer der Index des Prozesses ist.

Leistungsstarke Lösung (ermöglicht es Ihnen, sich wieder mit dem Prozess zu verbinden, wenn er interaktiv ist):

screen

Sie können die Verbindung dann durch Drücken von Strg+a+d trennen und dann wieder herstellen, indem Sie screen -r

Beachten Sie auch die neuere Alternative zu screen, tmux.

1 Stimmen

Wenn ich also "screen" ausführe, erstelle ich den Bildschirm und laufe darin, richtig?

30 Stimmen

Ja, und dann können Sie die Verbindung durch Drücken von Strg+a, d trennen und dann durch Ausführen von screen -r wieder herstellen.

0 Stimmen

Nohup funktioniert nicht in EC2. Ich denke, weil ich als Root laufen muss. aber in EC2 können wir keinen Root-Zugang haben. Die Verwendung des Bildschirms ist eine viel bessere Wahl :)

143voto

Victor Schröder Punkte 5724

Dies ist eine alte Frage, die aber bei Google weit oben steht. Ich kann fast nicht glauben, dass die am höchsten bewerteten Antworten, weil die Ausführung eines node.js-Prozesses innerhalb einer Bildschirm-Sitzung, mit der & oder sogar mit dem nohup Flagge - und zwar alle - sind nur Behelfslösungen.

Insbesondere die Screen/Tmux-Lösung, die eigentlich als eine Amateur Lösung. Screen und Tmux sind nicht dafür gedacht, Prozesse am Laufen zu halten, sondern für das Multiplexen von Terminalsitzungen. Das ist in Ordnung, wenn Sie ein Skript auf Ihrem Server laufen lassen und die Verbindung unterbrechen wollen. Aber für einen Node.js-Server wollen Sie nicht, dass Ihr Prozess mit einer Terminalsitzung verbunden ist. Das ist zu anfällig. Um die Dinge am Laufen zu halten, müssen Sie den Prozess dämonisieren!

Dafür gibt es viele gute Werkzeuge.

PM2 : http://pm2.keymetrics.io/

# basic usage
$ npm install pm2 -g
$ pm2 start server.js

# you can even define how many processes you want in cluster mode:
$ pm2 start server.js -i 4

# you can start various processes, with complex startup settings
# using an ecosystem.json file (with env variables, custom args, etc):
$ pm2 start ecosystem.json

Einen großen Vorteil von PM2 sehe ich darin, dass es das Systemstartskript generieren kann, damit der Prozess zwischen den Neustarts bestehen bleibt:

$ pm2 startup [platform]

Wo platform kann sein ubuntu|centos|redhat|gentoo|systemd|darwin|amazon .

für immer.js : https://github.com/foreverjs/forever

# basic usage
$ npm install forever -g
$ forever start app.js

# you can run from a json configuration as well, for
# more complex environments or multi-apps
$ forever start development.json

Init-Skripte :

Ich werde nicht ins Detail gehen, wie man ein Init-Skript schreibt, weil ich kein Experte auf diesem Gebiet bin und es zu lang für diese Antwort wäre, aber im Grunde sind es einfache Shell-Skripte, die durch Betriebssystemereignisse ausgelöst werden. Sie können mehr darüber lesen aquí

Docker :

Führen Sie Ihren Server einfach in einem Docker-Container mit -d Option und, voilá haben Sie einen daemonisierten node.js-Server!

Hier ist ein Beispiel für eine Dockerdatei (aus node.js) offizieller Führer ):

FROM node:argon

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

Erstellen Sie dann Ihr Image und starten Sie Ihren Container:

$ docker build -t <your username>/node-web-app .
$ docker run -p 49160:8080 -d <your username>/node-web-app

Ich hoffe, dies hilft jemandem, der auf dieser Seite landet. Verwenden Sie immer das richtige Werkzeug für die Arbeit. Das wird Ihnen eine Menge Kopfschmerzen und Überstunden ersparen!

2 Stimmen

Das ist es, wonach ich gesucht habe. Gibt es bei der pm2-Lösung eine Möglichkeit, später ein Terminal anzuschließen?

4 Stimmen

@Quantumplation, nein. Das ist nicht möglich, weil der Prozess nicht in einer interaktiven Sitzung läuft. Aber Sie können das gleiche "Gefühl" haben, indem Sie tail -f in der von pm2 erzeugten Protokolldatei.

1 Stimmen

Sie geben die screen Die Lösung, die nach Ansicht vieler Menschen funktioniert, ist ein Workaround. Es gibt viele Möglichkeiten, eine bestimmte Aufgabe zu erfüllen. Ich glaube, dass es zufällig (wenn man die spezifische Frage betrachtet) die spezifische Aufgabe ist, die run as background and never die hervorragend für viele. Außerdem hat es den zusätzlichen Vorteil, dass der Benutzer zurückgehen kann, um erneut zu interagieren und Änderungen vorzunehmen, wenn er möchte. Der Schlüssel ist Komponenten ist background y never die . Alle Lösungen haben bestimmte Boni.

140voto

Alex Povar Punkte 4733

Sie sollten wirklich versuchen, die screen . Es ist ein bisschen komplizierter als nur die nohup long_running & aber wenn man den Bildschirm einmal verstanden hat, kommt man nie wieder zurück.

Starten Sie zunächst Ihre Bildschirmsitzung:

user@host:~$ screen

Führen Sie aus, was Sie wollen:

wget http://mirror.yandex.ru/centos/4.6/isos/i386/CentOS-4.6-i386-binDVD.iso

Drücken Sie ctrl+A und dann d. Fertig. Ihre Sitzung läuft im Hintergrund weiter.

Sie können alle Sitzungen auflisten nach screen -ls und befestigen Sie sie an einigen mit screen -r 20673.pts-0.srv wobei 0673.pts-0.srv eine Eintragsliste ist.

0 Stimmen

screen ist für die Interaktivität gedacht; für nicht-interaktive Skripte würden viele argumentieren, dass nohup ist die kanonische Lösung.

27voto

myururdurmaz Punkte 379

Eine andere Lösung: den Job ablehnen

$ nohup node server.js &
[1] 1711
$ disown -h %1

1 Stimmen

Disown ist genau das, wonach ich gesucht habe, aber was bewirkt das Flag -h? Ich kann es nicht im Handbuch finden

0 Stimmen

Aus der Manpage: Wenn die Option -h angegeben wird, wird jeder Jobspec nicht aus der Tabelle entfernt, sondern so markiert, dass kein SIGHUP an den Job gesendet wird, wenn die Shell ein SIGHUP erhält. Wenn kein Jobspec angegeben wird, bedeutet die Option -a, dass alle Jobs entfernt oder markiert werden;

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