Démarrer automatiquement pour toujours (noeud) lors du redémarrage du système

j'utilise le module forever de node pour garder mon serveur de node en marche. Jamais cependant se termine lorsqu'il y a un redémarrage du système. Y a-t-il un moyen de démarrer automatiquement le serveur de noeuds (avec forever) lorsque le système redémarre?

163
demandé sur Der Hochstapler 2012-11-14 22:31:40

15 réponses

je suggère d'utiliser crontab. Il est facile à utiliser.

Comment faire

  1. Si vous choisissez un autre utilisateur que vous, vous devrez exécuter ceci avec sudo.

    $ crontab -u testuser -e
    
  2. si vous n'avez jamais fait cela avant, il vous demandera quel éditeur vous souhaitez éditer. J'aime vim, mais nous vous recommandons de nano pour la facilité d'utilisation.

  3. une fois dans l'éditeur ajouter la ligne suivante:

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
    
  4. Enregistrer le fichier. Vous devriez obtenir des commentaires que le cron a été installé.

  5. pour une confirmation supplémentaire de l'installation du cron, exécutez ce qui suit (en remplaçant à nouveau "testuser" par votre cible nom d'utilisateur) pour lister les crons actuellement installés:

    $ crontab -u testuser -l 
    

notez qu'à mon avis, vous devriez toujours utiliser des chemins complets lors de l'exécution de binaires dans cron. Aussi, si le chemin vers votre script forever n'est pas correct, Lancez which forever pour obtenir le chemin complet.

étant Donné que forever appels node , vous pouvez également fournir le chemin complet node :

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

Autres Lectures

308
répondu Julian Lannigan 2015-11-09 17:28:07

vous pouvez utiliser forever-service pour ce faire.

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

la Présente disposition d'application.js dans le répertoire courant comme un service via pour toujours. Le service redémarre automatiquement chaque fois que le système est redémarré. Aussi quand arrêté il tentera un arrêt gracieux. Ce script fournit aussi le script logrotate.

GitHub url: https://github.com/zapty/forever-service

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

112
répondu arva 2014-08-21 10:16:52

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}} remplacer par votre nom d'utilisateur

{{app path}} remplacez par votre app path. Par exemple, /var/www/test/app.js

22
répondu NiLL 2018-03-30 09:09:05
  1. installez les P2 à L'échelle mondiale en utilisant le MPN

    npm install pm2 -g

  2. Début de votre script avec les pm2

    pm2 start app.js

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

    pm2 startup

    NOTE: le démarrage de pm2 est pour démarrer le PM2 quand le système redémarre. Une fois commencées, les PM2 les processus qu'elle gérait avant que le système ne tombe en panne.

dans le cas où vous voulez désactiver le démarrage automatique, il suffit d'utiliser 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>:

14
répondu fsamuel 2017-06-02 21:04:32

Une alternative crontab méthode inspirée par ce réponse et ce post de blog.

1. Créer un fichier script bash (changer bob En utilisateur désiré).

vi /home/bob/node_server_init.sh

2. Copiez et collez ceci 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 selon votre configuration!

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

chmod 700 /home/bob/node_server_init.sh

4. Remplacer " bob " par l'utilisateur runtime pour noeud.

crontab -u bob -e

5. Copier et coller (changer bob à l'utilisateur désiré).

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

Enregistrer la crontab.

Vous l'avez fait à la fin, votre prix est un reboot (à test):)

10
répondu Emre 2017-05-23 12:34:53

copie de la réponse jointe question .

vous pouvez utiliser PM2 , c'est un gestionnaire de processus de production pour Node.js applications avec un équilibreur de charge.

Install 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 énumérera tous les processus. Vous pouvez alors 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]
8
répondu Vikash Rajpurohit 2017-05-23 12:26:36

Vous devez créer un script shell dans /etc/init.dossier d pour ça. C'est un peu compliqué si vous n'avez jamais fait, mais il ya beaucoup d'informations sur le web sur init.d scripts.

voici un exemple d'un script que j'ai créé pour exécuter un site CoffeeScript avec forever:

#!/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 "" 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 étaient explicitement définis ou disponibles pour l'utilisateur root depuis init.les scripts d sont lancés en tant que root.

7
répondu Hector Correa 2017-01-18 17:42:08

utilisez le PM2

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

Quels sont les avantages de faire fonctionner votre application de cette façon?

  • les PM2 redémarrent automatiquement votre application si elle tombe en panne.

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

  • avec une commande, PM2 peut s'assurer que toutes les applications qu'elle gère redémarrent lorsque le serveur redémarre. Fondamentalement, votre application de noeud commencera comme un service.

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

6
répondu Vishnu Mishra 2016-06-08 11:21:22

N'a jamais été fait pour obtenir des applications de noeud fonctionnant comme des services. La bonne approche consiste soit à créer une entrée /etc/inittab (anciens systèmes linux), soit à lancer (nouveaux systèmes linux).

Voici de la documentation sur la façon de le configurer comme un arriviste: https://github.com/cvee/node-upstart

5
répondu snez 2012-11-15 00:00:33

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

finalement j'ai eu cette solution.

Éditer /etc/rc.local 151950920"

sudo vi /etc/rc.local

Ajouter cette ligne à la fin du fichier. Modifiez USER_NAME et PATH_TO_PROJECT à votre propre. NODE_ENV=production signifie que l'application fonctionne en mode production. Vous pouvez ajouter des lignes supplémentaires si vous avez besoin d'exécuter plus d'un nœud.js app.

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

Ne pas définissez NODE_ENV dans une ligne séparée, votre application fonctionnera toujours en mode développement, car forever n'obtient pas NODE_ENV.

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

Sauvegarder et quitter vi (appuyez sur la touche ECHAP : w q retour). Vous pouvez essayer de redémarrer votre serveur. Après votre serveur redémarre, votre nœud.l'application js devrait s'exécuter automatiquement, même si vous ne vous connectez pas à un compte à distance via ssh.

vous feriez mieux de mettre L'environnement NODE_ENV dans votre shell. NODE_ENV sera défini automatiquement lorsque votre compte USER_NAME se connecte.

echo export NODE_ENV=production >> ~/.bash_profile

pour que vous puissiez exécuter des commandes comme forever stop/start /PATH_TO_PROJECT/app.js via ssh sans réglage NODE_ENV de nouveau.

5
répondu Vince Yuan 2014-03-04 12:10:27

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

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

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

/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
3
répondu chovy 2012-11-14 22:14:38

j'ai essayé beaucoup des réponses ci-dessus. Aucun d'entre eux travaillaient 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 s'exécutent, /home n'est pas encore monté, donc l'application n'est pas démarrée.

puis j'ai trouvé ces instructions par 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 comme expliqué était très simple et fonctionne parfaitement: mes serveurs virtuels ont eu deux accidents physiques depuis - Temps d'arrêt était seulement d'environ une minute.

1
répondu Alex 2015-06-22 15:07:13

le problème de La rc.local est que les commandes sont accédées en tant que root, ce qui est différent de la journalisation en tant qu'utilisateur et en utilisant sudo.

j'ai résolu ce problème en ajoutant un .SH script avec les commandes de démarrage que je veux etc / profile.D. N'importe laquelle .SH file in profile.D se chargera automatiquement et toute commande sera traitée comme si vous utilisiez le sudo régulier.

Le seul inconvénient est l'utilisateur spécifié doit loggin pour que les choses commencent qui dans ma situation a toujours été le cas.

1
répondu Moe Elsharif 2017-03-08 18:22:51

vous pouvez utiliser la commande suivante dans votre shell pour démarrer votre noeud pour toujours

toujours d'application.js //mon nœud de script

vous devez garder à l'esprit que le serveur sur lequel votre application tourne doit toujours être maintenu.

0
répondu Gaurav Singh 2014-08-14 08:49:05

exemple complet crontab (situé à /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
répondu danday74 2017-01-17 11:54:39