Mise en place de Supervisor
Pour installer le gestionnaire de processus, il faut d'abord préparer l'environnement Python puis déployer l'outil.
# Installation des prérequis Python
sudo yum install -y python-setuptools
# Déploiement de Supervisor
sudo easy_install supervisor
Paramétrage global de Superviser
Une fois l'installation terminée, il est nécessaire de générer le fichier de configuration principal et de préparer la structure des dossiers.
# Création du répertoire de configuration
sudo mkdir -p /etc/supervisord.d
# Génération du fichier de base
echo_supervisord_conf | sudo tee /etc/supervisord.conf
# Initialisation du démon avec la configuration
supervisord -c /etc/supervisord.conf
# Édition du fichier pour l'inclusion dynamique
sudo vim /etc/supervisord.conf
Ajoutez la directive suivante à la fin du fichier pour qu'il prenne en compte les fichiers situés dans le répertoire dédié :
[include]
files = /etc/supervisord.d/*.ini
Déclaration de l'application .NET Core
Il faut maintenant créer un fichier spécifique pour définir comment Supervisor doit gérer notre application.
sudo vim /etc/supervisord.d/mon_api_netcore.ini
Insérez la configuration suivante dans ce fichier :
[program:mon_api_netcore]
command=/usr/bin/dotnet MonApi.dll
directory=/opt/apps/netcore_api/
environment=ASPNETCORE__ENVIRONMENT="Production"
user=www-data
stopsignal=QUIT
autostart=true
autorestart=true
startsecs=3
stderr_logfile=/var/log/supervisor/mon_api_err.log
stdout_logfile=/var/log/supervisor/mon_api_out.log
Détails des paramètres utilisés :
[program:mon_api_netcore]: Identifiant du processus supervisé.command: Commande d'exécution de l'assembly .NET.directory: Dossier de travail d'où le programme sera lancé.environment: Variables d'environnement injectées au démarrage.user: Utilisateur système sous lequel le processus tourne.stopsignal: Signal système envoyé pour arrêter le processus (QUIT ici).autostart: Lancement automatique avec Supervisor.autorestart: Redémarrage automatique en cas de crash.startsecs: Durée minimale de fonctionnement avant de considérer le démarrage comme réussi.stderr_logfile: Emplacement des journaux d'erreurs.stdout_logfile: Emplacement des journaux de sortie standard.
Après avoir sauvegardé, rechargez la configuration pour appliquer les changements :
supervisorctl reload
Activation au démarrage du système avec systemd
Pour garantir que Supervisor s'exécute dès le boot de la machine, nous devons créer une unité systemd.
sudo vim /etc/systemd/system/supervisord.service
Contenu de l'unité systemd :
[Unit]
Description=Daemon Supervisor pour la gestion des processus
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl shutdown
ExecReload=/usr/local/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Explications des directives systemd :
Type=forking: Indique que le processus principal crée un fork lors de son lancement, typique pour un démon.ExecStart,ExecStop,ExecReload: Commandes respectives pour démarrer, arrêter et recharger la configuration du service.KillMode=process: Lors de l'arrêt de l'unité, seul le processus principal est terminé, laissatn le contrôle des sous-processus à Supervisor.Restart=on-failure: Le service redémarre uniquement en cas de code de sortie anormal ou de crash.RestartSec: Délai d'attente avant une tentative de redémarrage.WantedBy=multi-user.target: Définit la cible d'installation pour le démarrage automatique en mode multi-utilisateurs.
Activez le service au démarrage et vérifiez son statut :
# Activation au boot
sudo systemctl enable supervisord.service
# Vérification du statut d'activation
sudo systemctl is-enabled supervisord.service
Gestion courante et diagnostic
Voici les commandes essentielles pour interagir avec Supervisor au quotidien :
# Extinction complète du superviseur
supervisorctl shutdown
# Démarrer l'ensemble des processus déclarés
supervisorctl start all
# Arrêter toutes les applications gérées
supervisorctl stop all
# Cibler une application spécifique (remplacer <app_id> par l'identifiant défini dans [program:x])
supervisorctl start <app_id>
supervisorctl stop <app_id>
supervisorctl restart <app_id>
# Consulter l'état global des tâches
supervisorctl status
# Analyser les journaux d'erreurs de l'application
tail -f /var/log/supervisor/mon_api_err.log
# Suivre les flux de sortie standard
tail -f /var/log/supervisor/mon_api_out.log