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.

3voto

user3132194 Punkte 1961

Um den Befehl als Systemdienst unter Debian mit sysv init auszuführen:

Kopieren Sie das Skelettskript und passen Sie es an Ihre Bedürfnisse an, wahrscheinlich müssen Sie nur einige Variablen setzen. Ihr Skript erbt die Standardeinstellungen von /lib/init/init-d-script Wenn etwas nicht Ihren Bedürfnissen entspricht, überschreiben Sie es in Ihrem Skript. Wenn etwas schief geht, können Sie Details im Quelltext sehen /lib/init/init-d-script . Obligatorische Variablen sind DAEMON y NAME . Das Skript verwendet start-stop-daemon um Ihren Befehl auszuführen, in START_ARGS können Sie zusätzliche Parameter von start-stop-daemon zu verwenden.

cp /etc/init.d/skeleton /etc/init.d/myservice
chmod +x /etc/init.d/myservice
nano /etc/init.d/myservice

/etc/init.d/myservice start
/etc/init.d/myservice stop

So lasse ich einige Python-Sachen für mein Wikimedia-Wiki laufen:

...
DESC="mediawiki articles converter"
DAEMON='/home/mss/pp/bin/nslave'
DAEMON_ARGS='--cachedir /home/mss/cache/'
NAME='nslave'
PIDFILE='/var/run/nslave.pid'
START_ARGS='--background --make-pidfile --remove-pidfile --chuid mss --chdir /home/mss/pp/bin'

export PATH="/home/mss/pp/bin:$PATH"

do_stop_cmd() {
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
        $STOP_ARGS \
        ${PIDFILE:+--pidfile ${PIDFILE}} --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    rm -f $PIDFILE
    return $RETVAL
}

Neben dem Setzen von Variablen musste ich die do_stop_cmd weil Python die ausführbare Datei ersetzt, so dass der Dienst nicht ordnungsgemäß beendet wurde.

3voto

Abgesehen von den oben genannten coolen Lösungen möchte ich auch die Tools Supervisord und Monit erwähnen, die es erlauben, Prozesse zu starten, ihre Anwesenheit zu überwachen und sie zu starten, wenn sie gestorben sind. Mit 'monit' können Sie auch einige aktive Überprüfungen durchführen, z.B. ob ein Prozess auf eine http-Anfrage antwortet

3voto

David Lopes Punkte 472

Für Ubuntu benutze ich dies:

(exec PROG_SH &> /dev/null &)

Grüße

0 Stimmen

Kleine Anmerkung: 'exec' wird nicht benötigt, wenn PROG_SH eine ausführbare Datei ist. Der Sinn der von David vorgeschlagenen Lösung ist, das Kind von der aktuell laufenden Shell zu trennen. Der Elternteil des Childs wird zu 'pid 1' und ist nicht betroffen, wenn die Shell beendet wird.

0voto

Hunter Frazier Punkte 467

Versuchen Sie diese einfache Lösung

cmd & Ausgang

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