web-dev-qa-db-fra.com

Démarrer automatiquement pour toujours (nœud) au redémarrage du système

J'utilise le module forever du nœud pour que mon serveur de nœuds continue de fonctionner. Pour toujours cependant se termine quand il y a un redémarrage du système. Existe-t-il un moyen de démarrer automatiquement le serveur de noeud (avec toujours) au redémarrage du système?

181
kehers

Je suggérerais d'utiliser crontab. C'est facile à utiliser.

Comment

  1. Pour commencer l’édition, procédez comme suit en remplaçant "testuser" par l’utilisateur d’exécution souhaité pour le processus de noeud. Si vous choisissez un autre utilisateur que vous-même, vous devrez exécuter ceci avec Sudo.

    $ crontab -u testuser -e
    
  2. Si vous ne l'avez jamais fait auparavant, il vous sera demandé avec quel éditeur vous souhaitez éditer. J'aime vim, mais je recommanderai nano pour sa facilité d'utilisation.

  3. Une fois dans l'éditeur, ajoutez la ligne suivante:

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
    
  4. Enregistrez le fichier. Vous devriez avoir quelques informations sur le fait que le cron a été installé.

  5. Pour confirmer davantage l'installation du cron, exécutez la procédure suivante (en remplaçant de nouveau "testuser" par votre nom d'utilisateur cible) pour répertorier les crons actuellement installés:

    $ crontab -u testuser -l 
    

Notez qu'à mon avis, vous devez toujours utiliser des chemins complets lors de l'exécution des fichiers binaires dans cron. De plus, si le chemin d'accès à votre script forever n'est pas correct, exécutez which forever pour obtenir le chemin complet.

Étant donné que forever appelle node, vous pouvez également indiquer le chemin complet d'accès à node:

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

Lectures complémentaires

335
Julian Lannigan

Vous pouvez utiliser le service forever pour le faire.

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

Cela va fournir app.js dans le répertoire actuel en tant que service via forever. Le service redémarre automatiquement à chaque redémarrage du système. De plus, une fois arrêté, il tentera un arrêt gracieux. Ce script fournit également le script logrotate.

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

NOTE: Je suis l'auteur de forever-service.

120
arva

Ce cas est valable pour Debian.
Ajouter ce qui suit à /etc/rc.local

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

{{utilisateur}} remplacez votre nom d'utilisateur
{{app path}} remplacer dans votre chemin d'application. Par exemple, /var/www/test/app.js

24
NiLL
  1. Installer le PM2 globalement en utilisant NPM

    npm install pm2 -g

  2. Commencez votre script avec pm2

    pm2 start app.js

  3. générer un script de démarrage actif

    pm2 startup

    REMARQUE: Le démarrage de pm2 sert à démarrer le PM2 lorsque le système redémarre. PM2 une fois démarré, redémarre tous les processus qu’il gérait avant la panne du système.

Si vous souhaitez désactiver le démarrage automatique, utilisez simplement pm2 unstartup

Si vous voulez que le script de démarrage soit exécuté sous un autre utilisateur, utilisez simplement l'option -u <username> et le --hp <user_home>:.

19
fsamuel

Une méthode alternative de crontab inspirée par this answer et this blog.

1. Créez un fichier de script bash (changez bob en utilisateur souhaité).

vi /home/bob/node_server_init.sh

2. Copiez-le et collez-le dans le fichier que vous venez de créer.

#!/bin/sh

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

Assurez-vous de modifier les chemins ci-dessus en fonction de votre configuration!

3. Assurez-vous que le script bash peut être exécuté.

chmod 700 /home/bob/node_server_init.sh

4. Remplacez "bob" par l'utilisateur d'exécution pour le noeud.

crontab -u bob -e

5. Copier et coller (changer bob en utilisateur souhaité).

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

Enregistrez la crontab.

Vous êtes arrivé à la fin, votre prix est un redémarrage (à tester):)

10
Emre

Copie de la réponse de la pièce jointe question .

Vous pouvez utiliser PM2 , il s'agit d'un gestionnaire de processus de production pour les applications Node.js avec un équilibreur de charge intégré.

Installer le PM2

$ npm install pm2 -g

Lancer une application

$ pm2 start app.js

Si vous utilisez Express, vous pouvez démarrer votre application comme

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

Liste de tous les processus en cours d'exécution:

$ pm2 list

Il listera tout le processus. Vous pouvez ensuite arrêter/redémarrer votre service en utilisant l'ID ou le nom de l'application avec la commande suivante.

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

Pour afficher les journaux

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

Pour cela, vous devez créer un script Shell dans le dossier /etc/init.d. C'est un peu compliqué si vous ne l'avez jamais fait, mais il y a beaucoup d'informations sur le Web sur les scripts init.d.

Voici un exemple de script que j'ai créé pour exécuter un site CoffeeScript avec toujours:

#!/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

Je devais m'assurer que le dossier et les chemins d'accès étaient définis explicitement ou disponibles pour l'utilisateur root puisque les scripts init.d sont exécutés en tant que root.

7
Hector Correa

Utilisez le PM2

Quelle est la meilleure option pour exécuter le serveur de production du serveur

Quels sont les avantages d'exécuter votre application de cette façon?

  • PM2 redémarrera automatiquement votre application si elle se bloque.

  • PM2 conservera un journal de vos exceptions non gérées - dans ce cas, dans un fichier situé dans /home/safeuser/.pm2/logs/app-err.log.

  • Avec une seule commande, PM2 peut s’assurer que toutes les applications qu’il gère gèrent au redémarrage au redémarrage du serveur. Fondamentalement, votre application de noeud démarrera en tant que service.

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 n'a pas été conçu pour que les applications de noeud s'exécutent en tant que services. La bonne approche consiste à créer une entrée/etc/inittab (anciens systèmes Linux) ou une nouvelle installation (nouveaux systèmes Linux).

Voici de la documentation sur la manière de configurer cela en tant que mise à jour: https://github.com/cvee/node-upstart

5
snez

crontab ne fonctionne pas pour moi sur CentOS x86 6.5. @reboot semble ne pas fonctionner.

Enfin j'ai eu cette solution.

Éditez /etc/rc.local

Sudo vi /etc/rc.local

Ajoutez cette ligne à la fin du fichier. Remplacez USER_NAME et PATH_TO_PROJECT par vos propres moyens. NODE_ENV = production signifie que l'application s'exécute en mode production. Vous pouvez ajouter plus de lignes si vous devez exécuter plusieurs applications node.js.

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

Ne définissez pas NODE_ENV sur une ligne distincte, votre application fonctionnera toujours en mode de développement, car NODE_ENV ne sera jamais récupéré.

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

Sauvegarder et quitter vi (appuyez sur ESC: w q return). Vous pouvez essayer de redémarrer votre serveur. Après le redémarrage de votre serveur, votre application node.js devrait s'exécuter automatiquement, même si vous ne vous connectez à aucun compte à distance via ssh.

Vous feriez mieux de définir l'environnement NODE_ENV dans votre shell. NODE_ENV sera défini automatiquement lorsque votre compte USER_NAME sera connecté.

echo export NODE_ENV=production >> ~/.bash_profile

Ainsi, vous pouvez exécuter des commandes comme arrêter à tout jamais/démarrer /PATH_TO_PROJECT/app.js via ssh sans redéfinir NODE_ENV.

5
Vince Yuan

J'ai écrit un script qui fait exactement ceci:

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

Je n'ai pas essayé avec toujours, mais vous pouvez personnaliser la commande qu'il exécute, il devrait donc être simple:

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

J'ai essayé beaucoup de réponses ci-dessus. Aucun d'entre eux n'a fonctionné pour moi. Mon application est installée dans /home et en tant qu'utilisateur, pas en tant que root. Cela signifie probablement que lorsque les scripts de démarrage mentionnés ci-dessus sont exécutés, /home n'est pas encore monté et l'application n'est donc pas lancée.

Ensuite, j'ai trouvé ces instructions de Digital Ocean:

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

L’utilisation de PM2, telle qu’expliquée ci-dessus, était très simple et fonctionnait parfaitement: Mes serveurs virtuels ont eu deux pannes physiques car - les temps morts n’étaient qu’en une minute environ.

1
Alex

Le problème avec rc.local est que les commandes sont accessibles en tant que root, ce qui est différent de la connexion à en tant qu'utilisateur et de l'utilisation de Sudo.

J'ai résolu ce problème en ajoutant un script .sh avec les commandes de démarrage que je veux, etc/profile.d. Tout fichier .sh dans profile.d se chargera automatiquement et toute commande sera traitée comme si vous utilisiez le logiciel Sudo standard.

Le seul inconvénient, c’est que l’utilisateur spécifié doit se connecter pour commencer, ce qui, dans ma situation, a toujours été le cas.

1
Moe Elsharif

Vous pouvez utiliser la commande suivante dans votre shell pour démarrer votre noeud pour toujours
forever app.js // mon script de noeud
vous devez garder à l’esprit que le serveur sur lequel votre application est exécutée doit toujours être activé.

0
Gaurav Singh

exemple complet crontab (situé dans/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