Lancer NodeJS comme un service avec Upstart
Il est facile de lancer un serveur web, par exemple, avec NodeJS et une de ces commandes :
node web.js node web.js & node web.js >> /var/log/nodejs.log 2>&1
- La première lance le script web.js en console. Dès que la console est coupée, le script l’est aussi. Ballot.
- La seconde permet de garder le script web.js en arrière-plan, mais si le script cherche à écrire quelque chose sur stdout et que la console est coupée, le script va crasher. Et oui stdout n’existe plus.
- La dernière solution est la meilleure des 3 mais en cas de crash ou de redémarrage du serveur, on est obligé de relancer le script à la main.
Mais alors, comment je fais ? Je reste au cul du serveur, à guetter sur htop si mon script disparait pour pouvoir garder un service continu ?
Et non, il y a Upstart !
Upstart est un outil basé sur les évènements et permet de lancer des tâches ou des services pendant un boot, les arrêter quand le serveur s’arrête et pouvoir superviser le service à tout moment.
Comment installer Upstart ?
Si vous êtes sur Ubuntu, il n’y a rien à faire. C’est installé d’origine.
Sinon un classique fera l’affaire :
apt-get install upstart
Configuration de Upstart
Cet outil fonctionne avec des fichiers de configuration qu’il faut placer dans /etc/init/. Voici mon fichier web.conf pour mon serveur web NodeJS:
#!uptart description "Web server" author "Maxime Chaillou" #Évènements sur lesquels le script se lance start on (local-filesystems and net-device-up IFACE!=lo) #Évènement sur lequel le script s'arrête stop on shutdown #Définition de variables env LOG=/var/log/nodejs/web.log env USER=www-data env DIRECTORY=/home/user/www #Permet de relancer le script en cas de crash respawn #Script à exécuter script export HOME="/root" echo $$ > /var/run/web.pid exec sudo -u $USER /usr/bin/node $DIRECTORY/web.js >> $LOG 2>&1 end script #Script à exécuter juste avant le lancement pre-start script echo "[`date -u +%Y-%m-%d\\ %T.%3N`] Starting" >> $LOG end script #Script à éxécuter juste après le lancement pre-stop script rm /var/run/web.pid echo "[`date -u +%Y-%m-%d\\ %T.%3N`] Stopping" >> $LOG end script
Voilà rien de bien compliqué. Je vais pas détailler plus, c’est assez simple à comprendre.
Utilisation de Upstart
Maintenant pour lancer son script comme un service c’est super simple. Il suffit d’exécuter:
Pour lancer le service:
start web
Pour arreter le service:
stop web
Pour vérifier le statut du service:
status web
Astuce
Si vous voyez celà pendant que vous lancez le service
start: Unknown job: web
C’est qu’il y a une erreur dans le fichier de configuration.
Ou que le fichier n’est pas dans /etc/init, ou que le fichier n’est pas web.conf. Mais là c’est que vous n’auriez pas bien suivi le tuto ;).