Gestion de Processus avec Supervisor sur Linux/Unix

Supervisor est un système client/serveur développé en Python, conçu pour surveiller et contrôler de multiples processus sur les systèmes d'exploitation de type UNIX. Il assure la stabilité des applications en gérant leur cycle de vie : démarrage, arrêt, et redémarrage automatique en cas d'échec inattendu. Cette capacité permet aux administrateurs système de ne plus avoir à écrire des scripts personnalisés pour maintenir les processus actifs.

Configuration d'un Programme

Pour que Supervisor prenne en charge un processus, il est nécessaire de définir ce dernier dans son fichier de configuration (généralement /etc/supervisord.conf ou un fichier inclus depuis un répertoire comme /etc/supervisor/conf.d/). Voici un exemple de configuration pour un script de travail en arrière-plan :

[program:background-worker]
command = /usr/bin/python3 /opt/app/scripts/process_queue.py --env prod
directory = /opt/app
user = appuser
autostart = true
autorestart = unexpected
stopasgroup = true
killasgroup = true
stderr_logfile = /var/log/app/worker_error.log
stdout_logfile = /var/log/app/worker_output.log
environment = PATH="/usr/local/bin:/usr/bin", LOG_LEVEL="INFO"

Dans cet exemple, background-worker est le nom du programme géré. Les directives clés incluent :

  • command : Spécifie la commande complète à exécuter pour démarrer le processus.
  • directory : Définit le répertoire de travail pour le processus.
  • user : Le nom d'utilisateur sous lequel le processus s'exécute.
  • autostart : Indique si le programme doit démarrer automatiquement au lancement de Supervisor.
  • autorestart = unexpected : Assure que le programme redémarre s'il se termine de manière inattendue (par exemple, suite à un crash).
  • stderr_logfile et stdout_logfile : Essentiels pour le débogage, ils redirigent les sorties d'errreur et standard du processus vers des fichiers journaux dédiés. Cela permet de diagnostiquer les problèmes sans interférer avec la console principale.
  • environment : Permet de définir des variables d'environnement spéciifques pour le processus, telles que la variable PATH, qui est cruciale pour que le processus trouve ses exécutables si son environnement n'est pas complètement initialisé.

Opérations de Base avec supervisorctl

L'outil en ligne de commande supervisorctl est utilisé pour interagir avec le démon Supervisor. Il permet de contrôler les processus définis dans sa configuration. Pour spécifier le fichier de configuration principal, utilisez l'option -c.

# Démarrer un programme spécifique
supervisorctl -c /etc/supervisord.conf start background-worker

# Arrêter un programme spécifique
supervisorctl -c /etc/supervisord.conf stop background-worker

# Redémarrer un programme spécifique
supervisorctl -c /etc/supervisord.conf restart background-worker

# Afficher l'état de tous les programmes
supervisorctl -c /etc/supervisord.conf status

# Démarrer tous les programmes configurés
supervisorctl -c /etc/supervisord.conf start all

# Arrêter tous les programmes configurés
supervisorctl -c /etc/supervisord.conf stop all

# Recharger la configuration de Supervisor et mettre à jour les programmes
supervisorctl -c /etc/supervisord.conf reread
supervisorctl -c /etc/supervisord.conf update

Gestion des Redémarrages Automatiques et Limites

La directive autorestart=unexpected est très utile pour garantir qu'un processus se relance après un crash. Cependant, elle ne couvre pas tous les scénarios. Si un processus rencontre des problèmes de performance, tels que des fuites de mémoire (memory leaks) ou des connexions non libérées, il peut continuer à s'exécuter dans un état dégradé sans jamais se terminer de manière "inattendue". Dans de tels cas, Supervisor ne déclenchera pas de redémarrage automatique car le processus n'a techniquement pas planté.

Planification de Redémarrages Périodiques

Pour les processus sujets à des fuites de mémoire ou d'autres problèmes nécessitant des redémarrages réguliers, on peut combiner Supervisor avec crontab pour planifier des redémarrages périodiques. Cette approche permet de "rafraîchir" le processus à intervalles réguliers, prévenant ainsi l'accumulation de ressources non libérées.

Voici un exemple de tâche crontab qui redémarre un service toutes les 6 heures :

0 */6 * * * /usr/bin/supervisorctl -c /etc/supervisord.conf restart data-processor

Dans cet exemple, le processus data-processor sera redémarré à minuit, 6h, 12h et 18h chaque jour. Cette technique est un moyen efficace de maintenir la santé de processus qui, autrement, deviendraient instables sur le long terme.

Étiquettes: supervisord gestion de processus Linux Unix administration système

Publié le 13 août à 13h03