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 supervisor
Langage 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.