Pour gérer les processeurs sous Linux, il existe des systèmes d'initialisation comme systemd. Si vous avez besoin d'une solution plus simple, un programme qui peut gérer les processus de votre application, soit sur le système, soit dans un conteneur Docker. Un tel programme existe - il s'agit de supervisor. Il s'agit d'un gestionnaire de processus open-source fonctionnellement simple écrit en Python, qui peut être utilisé pour exécuter autant de copies d'un processus que nécessaire et surveiller leur état. Nous allons vous montrer ci-dessous comment installer et configurer Supervisor en utilisant Ubuntu 20.04 comme exemple.
La manière la plus simple d'obtenir le programme est de l'installer à partir des dépôts officiels. Pour ce faire, vous devez exécuter la commande :
$ sudo apt install supervisor
Si vous souhaitez que le programme fonctionne en permanence, vous devez l'ajouter à votre autoloader et l'exécuter. Exécuter :
$ sudo systemctl enable supervisor --now
Vous pouvez ensuite consulter l'état du programme à l'aide de la commande :
$ sudo systemctl status supervisor
Le fichier de configuration se trouve dans /etc/supervisor/supervisord.conf.
C'est également là que se trouvent les paramètres de base. Il est préférable d'utiliser le répertoire /etc/supervisor/conf.d/
pour configurer les processus en cours d'exécution. Le fichier de configuration principal peut être laissé par défaut. Voyons comment créer des fichiers de configuration pour les programmes. La syntaxe d'une section pour un processus unique ressemble à ceci :
nom de la variable valeur
Pour chaque processus, il est nécessaire de passer ces variables pour qu'il démarre automatiquement et se rétablisse après un crash :
directory
- répertoire de travail ;
command
- commande de démarrage du processus ; user
- l'utilisateur au nom duquel le processus sera lancé ;
autostart
- indique si le processus doit être démarré automatiquement ; autorestart
- si le processus doit être redémarré ;
Cependant, il existe de nombreux autres paramètres disponibles, dont certains seront abordés dans cet article :
priority
- prioritédu
processus à démarrer ;
environment
- variables d'environnement à transmettre au processus ;
stdout_logfile
- où rediriger la sortie stdout du processus ;
stderr_logfile
- où rediriger la sortie stderr du processus ; process_name
- nom du processus, avec possibilité de remplacer le numéro de copie ;
numprocs
- nombre de copies du processus à démarrer ;
startretries
- nombre de tentatives de démarrage du programme ;
redirect_stderr
- redirige la sortie d'erreur du processus vers la sortie du superviseur ;
redirect_stdout
- redirige la sortie du processus vers la sortie du superviseur.Pour une meilleure compréhension et un meilleur exemple, exécutons un script PHP qui restera en arrière-plan :
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Vous pouvez créer un fichier de configuration du superviseur distinct pour le processus. Vous pouvez insérer la configuration à la fin du fichier de configuration principal, mais il est préférable de ne pas le faire. Il est préférable de créer un fichier de configuration distinct pour chaque programme dans /etc/supervisor/conf.d/
avec le nom *.conf. Par exemple, pour ce programme, ce fichier ressemblera à ceci :
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
Il faut ensuite redémarrer le superviseur, ce qui peut être fait avec systemctl :
$ sudo systemctl restart supervisor
ou avec l'utilitaire supervisorctl
:
$ sudo supervisorctl reload
Vous pouvez également voir l'état des processus configurés à l'aide de la commande :
Si le processus est dans l'état RUNNING, c'est bien et il a été démarré avec succès. Mais dans ce cas, le processus est exécuté dans une seule instance, et il est souvent nécessaire d'exécuter plusieurs copies du même processus. Pour ce faire, nous pouvons utiliser les paramètres process_name
et numprocs
. Le premier vous permet de modifier le nom du processus pour qu'il contienne le numéro de la copie, et le second vous permet de spécifier le nombre de copies à exécuter.
La variable process_name
contient généralement un modèle de formatage de chaîne python qui contient le nom du programme et le numéro du processus : %(program_name)s_%(process_num)02d
. Ici, le nom de la variable est entre parenthèses, suivi de son type. Par exemple, pour exécuter le même programme dans quatre threads, le fichier de configuration doit être défini sous cette forme :
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d
numprocs=4
Nous devons maintenant recharger supervisorctl
et 4 processus seront en cours d'exécution :
$ sudo supervisorctl status
En même temps, il est possible de sauvegarder toutes les données produites par le programme dans le fichier journal. Les paramètres stdout_logfile
et stderr_logfile
sont utilisés à cet effet. Par exemple, vous pouvez enregistrer le fichier journal de l'exécution du programme directement dans le dossier où se trouve le programme.
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d
numprocs=4
stdout_logfile=/home/sergiy/program/process.log
stderr_logfile=/home/sergiy/program/process.log.error
Après le redémarrage du service, les journaux apparaîtront dans le dossier du programme :
De même, si vous souhaitez rediriger la
sortie de vos processus vers la sortie standard du superviseur, vous devez utiliser les paramètres redirect_stderr
et redirect_stdout
. Si votre programme a besoin de variables d'environnement, vous pouvez les passer en utilisant le paramètre environment. Les variables doivent être écrites avec des virgules. Par exemple, les variables doivent être écrites avec une virgule :
$ environment=DISPLAY=":1",HOME="/root"
Après chaque changement de configuration, n'oubliez pas de redémarrer supervisor pour appliquer les changements. L'utilitaire supervisorctl peut être utilisé pour contrôler les processus. Comme vous l'avez déjà compris, pour voir la liste des processus, il faut les exécuter :
$ sudo supervisorctl status
Puis, connaissant le nom du processus, vous pouvez le redémarrer, par exemple process:process_00
:
$ sudo supervisorctl restart process:process_00
Arrêter :
$ sudo supervisorctl stop process:process_00
ou le démarrer :
$ sudo supervisorctl start process:process_00
Vous pouvez également vous connecter au processus et voir ce qu'il envoie à stdout/stderr
à l'aide de la commande fg
:
$ sudo supervisorctl fg process:process_00
Nous avons vu comment le superviseur
est configuré et comment utiliser le logiciel de gestion des processus.