Utilisation de Supervisor pour faire tourner des workers

J’ai déjà abordé à plusieurs reprises le sujet des « workers » (notamment dans mon article sur les architectures distribuées). L’idée générale est celle d’avoir plusieurs instances d’un programme qui s’exécutent simultanément en tâche de fond, attendant de recevoir des tâches à exécuter.

Habituellement, vous voulez qu’au démarrage de votre serveur, un nombre suffisant de processus soient lancés. En plus de cela, il y a souvent un risque non négligeable qu’un worker plante pour une raison ou une autre ; dans ce cas, il faut qu’il soit relancé rapidement, sinon les tâches en attente ne seront pas traitées.

Plusieurs outils permettent de gérer les workers, comme par exemple Supervisor, God ou Monit.

Personnellement, je n’utilise pas God, car il n’a pas de fichier de configuration et il faut éditer un script Ruby, ce qui ne me semble pas la manière la plus simple de procéder. Monit est satisfaisant, et ses fichiers de configuration ont une syntaxe compréhensible.

Mais je trouve que Supervisor est encore plus simple à utiliser.

Pour l’installer sous Ubuntu :

$ sudo apt install supervisorLangage du code : Shell Session (shell)

Utilisation de Supervisor pour gérer une instance unique

Imaginons qu’on veuille configurer la supervision d’un programme dont une seule instance doit s’exécuter en tâche de fond, que nous appellerons broker. Dans ce cas, il faut éditer le fichier de configuration /etc/supervisor/conf.d/broker.conf :

[program:broker]
command=/chemin/vers/broker
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/broker.log
stderr_logfile=/var/log/supervisor/broker-err.log
Langage du code : TOML, aussi INI (ini)
  • Ligne 1 : Début de la configuration du programme broker.
  • Ligne 2 : On donne le chemin vers le programme à exécuter.
  • Ligne 3 : On demande à Supervisor de lancer le programme automatiquement au démarrage.
  • Ligne 4 : On lui demande de relancer le programme si jamais il venait à s’interrompre.
  • Ligne 5 : Chemin vers le fichier de log vers lequel sera redirigée la sortie standard du programme.
  • Ligne 6 : Chemin vers le fichier de log vers lequel sera redirigée la sortie d’erreur du programme.

Pour que Supervisor prenne en compte ce fichier de configuration :

$ sudo supervisorctl reread
$ sudo supervisorctl update

Ensuite, il est possible de contrôler l’exécution du programme avec les commandes suivantes (respectivement pour démarrer, arrêter et redémarrer le programme) :

$ sudo supervisorctl start broker
$ sudo supervisorctl stop broker
$ sudo supervisorctl restart broker

Utilisation de Supervisor pour gérer des instances multiples

Maintenant que nous avons vu comment gérer l’exécution d’un programme avec une seule instance, voyons comment faire pour gérer un pool de workers.

Imaginons que nous souhaitions avoir en permanence cinq workers qui s’exécutent en parallèle. Pour cela, la configuration est identique à celle vue précédemment ; on va juste ajouter le paramètre numprocs pour indiquer le nombre de processus qui doivent tourner en permanence.
Voici un exemple de fichier de configuration /etc/supervisor/conf.d/worker.conf :

[program:worker]
command=/chemin/vers/worker
numprocs=5
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/worker.log
stderr_logfile=/var/log/supervisor/worker-err.log
Langage du code : TOML, aussi INI (ini)
  • Ligne 1 : Début de la configuration du programme worker.
  • Ligne 2 : On donne le chemin vers le programme à exécuter.
  • Ligne 3 : On donne le nombre d’instances du programme qui doivent tourner en même temps.
  • Ligne 4 : On demande à Supervisor de lancer le programme automatiquement au démarrage.
  • Ligne 5 : On lui demande de relancer le programme si jamais il venait à s’interrompre.
  • Ligne 6 : Chemin vers le fichier de log vers lequel sera redirigée la sortie standard du programme.
  • Ligne 7 : Chemin vers le fichier de log vers lequel sera redirigée la sortie d’erreur du programme.

Comme dans l’exemple précédent, on force Supervisor à prendre en compte cette configuration :

$ sudo supervisorctl reread
$ sudo supervisorctl update

Pour voir la liste des processus gérés par Supervisor :

$ sudo supervisorctl status

Cette commande affiche la liste des processus, avec pour chacun son numéro d’identification.

Il est possible de tuer des instances en temps réel avec la commande suivante :

$ sudo supervisorctl stop worker:NUMERO

Avec NUMERO qui correspond au numéro de l’instance que l’on souhaite arrêter.

Pour démarrer des instances supplémentaires en temps réel :

$ sudo supervisorctl start worker:NUMERO

Avec NUMERO qui est un numéro unique qui identifie cette nouvelle instance.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.