it-swarm.com.de

Automatisch für immer starten (Knoten) beim Neustart des Systems

Ich verwende das Forever-Modul des Knotens, um meinen Knotenserver am Laufen zu halten. Forever wird jedoch bei einem Systemneustart beendet. Gibt es eine Möglichkeit, den Knotenserver automatisch zu starten (für immer), wenn das System neu gestartet wird?

181
kehers

Ich würde vorschlagen, Crontab zu verwenden. Es ist einfach zu bedienen.

Wie man

  1. Führen Sie zum Starten der Bearbeitung die folgenden Schritte aus, und ersetzen Sie den "Testbenutzer" durch den gewünschten Laufzeitbenutzer für den Knotenprozess. Wenn Sie einen anderen Benutzer als sich selbst auswählen, müssen Sie dies mit Sudo ausführen.

    $ crontab -u testuser -e
    
  2. Wenn Sie dies noch nie getan haben, werden Sie gefragt, mit welchem ​​Editor Sie arbeiten möchten. Ich mag vim, empfehle aber nano wegen der einfachen Handhabung.

  3. Fügen Sie im Editor die folgende Zeile hinzu:

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
    
  4. Speicher die Datei. Sie sollten eine Rückmeldung erhalten, dass der Cron installiert wurde.

  5. Führen Sie zur weiteren Bestätigung der Installation des Cron Folgendes aus (ersetzen Sie "testuser" erneut durch Ihren Zielbenutzernamen), um die derzeit installierten Cron aufzulisten:

    $ crontab -u testuser -l 
    

Beachten Sie, dass Sie meiner Meinung nach immer vollständige Pfade verwenden sollten, wenn Sie Binärdateien in cron ausführen. Wenn der Pfad zu Ihrem Forever-Skript nicht korrekt ist, führen Sie which forever Aus, um den vollständigen Pfad abzurufen.

Angesichts der Tatsache, dass forevernode aufruft, möchten Sie möglicherweise auch den vollständigen Pfad zu node angeben:

@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js

Weitere Lektüre

335
Julian Lannigan

Hierfür können Sie forever-service verwenden.

npm install -g forever-service
forever-service install test

Dadurch werden app.js im aktuellen Verzeichnis für immer als Dienst bereitgestellt. Der Dienst wird bei jedem Neustart des Systems automatisch neu gestartet. Auch wenn es gestoppt ist, versucht es einen würdevollen Stopp. Dieses Skript enthält auch das Logrotate-Skript.

Github-URL: https://github.com/zapty/forever-service

HINWEIS: Ich bin der Autor von forever-service.

120
arva

Dieser Fall gilt für Debian.
Füge folgendes zu /etc/rc.local Hinzu

/usr/bin/Sudo -u {{user}} /usr/local/bin/forever start {{app path}}

{{user}} Ersetze deinen Benutzernamen
{{app path}} Ersetzen Sie Ihren App-Pfad. Zum Beispiel /var/www/test/app.js

24
NiLL
  1. Installieren Sie PM2 global mit NPM

    npm install pm2 -g

  2. Starten Sie Ihr Skript mit pm2

    pm2 start app.js

  3. ein aktives Startskript generieren

    pm2 startup

    ANMERKUNG: Der PM2-Start dient zum Starten des PM2 beim Neustart des Systems. Nach dem Start von PM2 werden alle Prozesse neu gestartet, die vor dem Systemausfall verwaltet wurden.

Wenn Sie den automatischen Start deaktivieren möchten, verwenden Sie einfach pm2 unstartup

Wenn Sie möchten, dass das Startskript unter einem anderen Benutzer ausgeführt wird, verwenden Sie einfach das -u <username> Option und die --hp <user_home>:

19
fsamuel

Eine alternative Crontab-Methode, inspiriert von this answer und this blog post.

1. Erstellen Sie eine Bash-Skript-Datei (ändern Sie Bob in den gewünschten Benutzer).

vi /home/bob/node_server_init.sh

2. Kopieren Sie diese und fügen Sie sie in die soeben erstellte Datei ein.

#!/bin/sh

export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null

Stellen Sie sicher, dass Sie die oben genannten Pfade entsprechend Ihrer Konfiguration bearbeiten!

3. Stellen Sie sicher, dass das Bash-Skript ausgeführt werden kann.

chmod 700 /home/bob/node_server_init.sh

4. Ersetzen Sie "bob" durch den Laufzeitbenutzer für den Knoten.

crontab -u bob -e

5. Kopieren und Einfügen (Bob in gewünschten Benutzer ändern).

@reboot /bin/sh /home/bob/node_server_init.sh

Speichern Sie die Crontab.

Du hast es bis zum Ende geschafft, dein Gewinn ist ein Neustart (zum Testen):)

10
Emre

Kopierte Antwort aus dem beigefügten Frage .

Sie können PM2 verwenden. Dies ist ein Produktionsprozessmanager für Node.js-Anwendungen mit einem integrierten Lastenausgleich.

Installieren Sie PM2

$ npm install pm2 -g

Starten Sie eine Anwendung

$ pm2 start app.js

Wenn Sie Express verwenden, können Sie Ihre App wie folgt starten

pm2 start ./bin/www --name="app"

Auflisten aller laufenden Prozesse:

$ pm2 list

Es werden alle Prozesse aufgelistet. Sie können dann Ihren Dienst stoppen/neu starten, indem Sie die ID oder den Namen der App mit dem folgenden Befehl eingeben.

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

Anzeigen von Protokollen

$ pm2 logs ['all'|app_name|app_id]
9

Dazu müssen Sie ein Shell-Skript im Ordner /etc/init.d erstellen. Es ist etwas kompliziert, wenn Sie es noch nie getan haben, aber im Internet finden Sie zahlreiche Informationen zu init.d-Skripten.

Hier ist ein Beispiel eines Skripts, das ich erstellt habe, um eine CoffeeScript-Site für immer auszuführen:

#!/bin/bash
#
# initd-example      Node init.d 
#
# chkconfig: 345 
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid 
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://Gist.github.com/jinze at https://Gist.github.com/3748766
#


# Source function library.
. /lib/lsb/init-functions


pidFile=/var/run/forever-initd-hectorcorrea.pid 
logFile=/var/run/forever-initd-hectorcorrea.log 

sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile


start() {
    echo "Starting $scriptId"

    # This is found in the library referenced at the top of the script
    start_daemon

    # Start our CoffeeScript app through forever
    # Notice that we change the PATH because on reboot
    # the PATH does not include the path to node.
    # Launching forever or coffee with a full path
    # does not work unless we set the PATH.
    cd $sourceDir
    PATH=/usr/local/bin:$PATH
    NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile

    RETVAL=$?
}

restart() {
    echo -n "Restarting $scriptId"
    /usr/local/bin/forever restart $scriptId
    RETVAL=$?
}

stop() {
    echo -n "Shutting down $scriptId"
    /usr/local/bin/forever stop $scriptId
    RETVAL=$?
}

status() {
    echo -n "Status $scriptId"
    /usr/local/bin/forever list
    RETVAL=$?
}


case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart)
        restart
        ;;
    *)
        echo "Usage:  {start|stop|status|restart}"
        exit 1
        ;;
esac
exit $RETVAL

Ich musste sicherstellen, dass der Ordner und die PATHs für den Root-Benutzer explizit festgelegt oder verfügbar waren, da init.d-Skripte als Root ausgeführt werden.

7
Hector Correa

Verwenden Sie die PM2

Welches ist die beste Option, um den Server Production Server auszuführen

Was sind die Vorteile, wenn Sie Ihre Anwendung auf diese Weise ausführen?

  • PM2 startet Ihre Anwendung automatisch neu, wenn sie abstürzt.

  • PM2 speichert ein Protokoll Ihrer nicht behandelten Ausnahmen - in diesem Fall in einer Datei unter /home/safeuser/.pm2/logs/app-err.log.

  • Mit einem Befehl kann PM2 sicherstellen, dass alle von ihm verwalteten Anwendungen beim Neustart des Servers neu gestartet werden. Grundsätzlich wird Ihre Knotenanwendung als Dienst gestartet.

ref: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

6
Vishnu Mishra

Forever wurde nicht erstellt, um Knotenanwendungen als Dienste auszuführen. Der richtige Ansatz besteht darin, entweder einen/etc/inittab-Eintrag (alte Linux-Systeme) oder einen Neustart (neuere Linux-Systeme) zu erstellen.

Hier ist eine Dokumentation, wie Sie dies als Startup einrichten können: https://github.com/cvee/node-upstart

5
snez

crontab funktioniert bei mir unter CentOS x86 6.5 nicht. @reboot scheint nicht zu funktionieren.

Endlich habe ich diese Lösung.

Bearbeiten Sie /etc/rc.local

Sudo vi /etc/rc.local

Fügen Sie diese Zeile am Ende der Datei hinzu. Ändern Sie USER_NAME und PATH_TO_PROJECT in Ihre eigenen. NODE_ENV = Produktion bedeutet, dass die App im Produktionsmodus ausgeführt wird. Sie können weitere Zeilen hinzufügen, wenn Sie mehr als eine node.js-App ausführen müssen.

su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"

Setzen Sie NODE_ENV nicht in eine separate Zeile, Ihre App wird weiterhin im Entwicklungsmodus ausgeführt, da NODE_ENV für immer nicht abgerufen wird.

# WRONG!
su - USER_NAME -c "export NODE_ENV=production"

Speichern und beenden Sie vi (drücken Sie ESC: w q return). Sie können versuchen, Ihren Server neu zu starten. Nach dem Neustart Ihres Servers sollte Ihre node.js-App automatisch ausgeführt werden, auch wenn Sie sich nicht über ssh remote bei einem Konto anmelden.

Sie sollten die NODE_ENV-Umgebung in Ihrer Shell festlegen. NODE_ENV wird automatisch festgelegt, wenn sich Ihr Konto USER_NAME anmeldet.

echo export NODE_ENV=production >> ~/.bash_profile

Sie können also Befehle wie forever stop/start /PATH_TO_PROJECT/app.js über ssh ausführen, ohne NODE_ENV erneut zu setzen.

5
Vince Yuan

Ich habe ein Skript geschrieben, das genau das macht:

https://github.com/chovy/node-startup

Ich habe es nicht ewig versucht, aber Sie können den ausgeführten Befehl anpassen, so dass es einfach sein sollte:

/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
3
chovy

Ich habe viele der obigen Antworten ausprobiert. Keiner von ihnen hat für mich gearbeitet. Meine App ist installiert in /home und als Benutzer, nicht als root. Dies bedeutet wahrscheinlich, dass bei Ausführung der oben genannten Startskripte /home ist noch nicht gemountet, daher wird die App nicht gestartet.

Dann habe ich diese Anleitung von Digital Ocean gefunden:

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

Die Verwendung von PM2 war sehr einfach und funktioniert einwandfrei: Meine virtuellen Server hatten seitdem zwei physische Abstürze - die Ausfallzeit betrug nur etwa eine Minute.

1
Alex

Das Problem mit rc.local ist, dass auf die Befehle als root zugegriffen wird, was sich von der Anmeldung als Benutzer und der Verwendung von Sudo unterscheidet.

Ich habe dieses Problem gelöst, indem ich ein .sh-Skript mit den Startbefehlen hinzugefügt habe, die ich für etc/profile.d verwenden möchte. Jede .sh-Datei in profile.d wird automatisch geladen und jeder Befehl wird so behandelt, als ob Sie das reguläre Sudo verwenden würden.

Der einzige Nachteil dabei ist, dass sich der angegebene Benutzer anmelden muss, damit Dinge beginnen können, was in meiner Situation immer der Fall war.

1
Moe Elsharif

Sie können den folgenden Befehl in Ihrer Shell verwenden, um Ihren Knoten für immer zu starten
forever app.js // mein Knotenskript
Sie müssen berücksichtigen, dass der Server, auf dem Ihre App ausgeführt wird, immer eingeschaltet bleiben sollte.

0
Gaurav Singh

vollständiges Beispiel crontab (befindet sich in/etc/crontab).

#!/bin/bash

# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l

# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

# * * * * * echo "executes once every minute" > /root/deleteme

@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;
0
danday74