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?
15 réponses
je suggère d'utiliser crontab. Il est facile à utiliser.
Comment faire
-
Si vous choisissez un autre utilisateur que vous, vous devrez exécuter ceci avec sudo.
$ crontab -u testuser -e
-
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.
-
une fois dans l'éditeur ajouter la ligne suivante:
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
-
Enregistrer le fichier. Vous devriez obtenir des commentaires que le cron a été installé.
-
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
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.
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
-
installez les P2 à L'échelle mondiale en utilisant le MPN
npm install pm2 -g
-
Début de votre script avec les pm2
pm2 start app.js
-
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>:
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):)
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]
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.
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.
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
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.
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
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:
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.
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.
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.
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;