Maxy.fr

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.

Categories : Linux, Node.JS

By Guillaume - 08/10/2016 at 10:33 pm

Shar this article :

Similar articles

How to resolve the Possible attack detected message in ISPConfig ?

If you are managing a web server with ISPConfig, you may encounter the warning message "Possible attack detected. This action has been logged." on the web interface, making access impossible. This alert can be triggered for various reasons, but its resolution is simple. Here's how to resolve...

Postfix : Fixing email sending issues to Gmail due to IPv6

If you are unable to send emails to Gmail addresses from your server and you encounter the following error, it is likely a configuration issue if you have both IPv4 and IPv6: Our system has detected that this message does 550-5.7.1 not meet IPv6 sending guidelines regarding PTR records and...

Finding and Stopping a Lingering Node.js Instance

If you've been playing around with Node.js, you've probably run a Node.js file and left it running in the background. You may be accustomed to using the shortcut ctrl + c (cmd + c) or ctrl + z (cmd + z) to suspend or stop its process. However, if you've closed the terminal with your SSH connection...