Démarrer automatiquement Node.JS au démarrage de son serveur
Si vous avez déjà fait des programmes en utilisant Node.JS, vous êtes surement déjà tombé sur ce problème : Les scripts Node.JS ne se relance pas automatiquement lorsque l'on redémarre son serveur. Il faut donc s'y connecter manuellement pour tout relancer, ce qui est plutôt contraignant.
Voici donc un petit script shell permettant d'exécuter vos script ainsi que le moyen de le démarrer à chaque fois que le serveur démarre.
Le script shell
Il vous faudra créer une page, que vous appellerez comme vous le souhaitez et que vous enregistrerez dans le dossier /etc/init.d/ sur votre serveur. Ici ma page s'appelle "autostartnode", pensez-donc à modifier le nom dans le code si vous ne souhaitez pas utiliser le même.
#!/bin/bash # /etc/init.d/autostartnode ### BEGIN INIT INFO # Provides: autostartnode # Required-Start: $local_fs $remote_fs # Required-Stop: $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Démarrage automatique des scripts Node.JS # Description: Démarrage automatique des scripts Node.JS ### END INIT INFO lancement(){ # On créé la session 'screen' en mode détaché screen -dmS nomScreen # On se déplace dans le chemin où se trouve nos scripts .js (Node.JS) screen -S nomScreen -p 0 -X stuff "cd /chemin/dossier/scripts/node/$(printf \\r)" # On lance notre script à l'aide de la commande 'node' screen -S nomScreen -p 0 -X stuff "/usr/local/bin/node server.js$(printf \\r)" sleep 3 # On patiente 3s le temps que le script s'execute # On vérifie que notre session screen se soit bien lancée et on affiche le résultat if ! screen -list | grep -q "nomScreen" then echo "AutoStartNode : Echec lors du lancement de 'nomScreen'" else echo "AutoStartNode : Lancement de 'nomScreen' reussi" fi } arret(){ # On supprime la session 'screen' précedemment créée screen -X -S nomScreen kill sleep 3 # On patiente 3s # On vérifie que l'arrêt a bien fonctionnée if ! screen -list | grep -q "nomScreen" then echo "AutoStartNode : Arrêt de 'nomScreen' reussi" else echo "AutoStartNode : Echec lors de l'arrêt de 'nomScreen'" fi } case "$1" in start) lancement ;; stop) arret ;; restart) arret lancement ;; *) echo "Usage: /etc/init.d/autostartnode {start|stop|restart}" exit 1 ;; esac exit 0
Le programme utilise 'screen', permettant la création de plusieurs sessions de terminaux. Une session sera créée pour chacun des scripts Node.JS qui seront exécutés. L'avantage de cette technique est que vous pourrez accéder facilement à chacun des terminaux pour voir l'état de votre serveur Node.JS.
Le programme est très simple, il comprend deux fonctions. Une pour le lancement et une pour l'arrêt des scripts. Il est possible d'utiliser trois arguments start, stop ou restart, c'est grâce à ceux-ci qu'on pourra faire en sorte que notre code s'exécute au lancement et à l'arrêt du serveur.
Tout le programme est commenté, je n'explique donc pas plus. Pour le lancement, il créé la session screen, exécute le script Node.JS et vérifie que la session soit bien lancée.
Le programme n'est pas vraiment optimisé et se contente du stricte minimum, il serait judicieux de vérifier qu'aucune session 'screen' du même nom existe déjà lors de sa création ... par exemple.
Ah et concernant la partie "BEGIN INIT INFO", je vous laisse vous renseigner si vous le souhaitez. Mais sachez qu'il s'agit d'une initialisation nécessaire pour son exécution automatique.
Configuration pour l'exécution automatique du script au lancement du serveur
Maintenant que votre script est prêt, il va falloir configurer votre serveur pour qu'il l'exécute automatiquement lors du démarrage ou de l'arrêt du serveur.
La première chose à faire est de donner les droits d'exécution de votre nouveau script. Pour cela voici la commande :
chmod +x /etc/init.d/autostartnode
Maintenant, pour dire à votre serveur d'exécuter le script à chaque arrêt/démarrage, utilisez la commande suivante :
sudo update-rc.d autostartnode defaults
C'est maintenant normalement fonctionnel.
Encore une fois cette technique est plutôt bancal et pas bien optimisé. Si vous avez d'autres techniques ou des suggestions, n'hésitez pas à en faire par dans les commentaires.
Par Guillaume le 10/08/2016 à 22:33