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

  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.
  2. 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.
  3. 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 ;).

Vus : 1276
Publié par Maxime CHAILLOU : 11