Til at styre processorer i Linux findes der initialiseringssystemer som systemd. Hvis du har brug for en enklere løsning, skal du bruge et program, som kan styre din applikations processer, enten på systemet eller i en Docker-container. Sådan et program findes - det er supervisor. Det er en funktionelt enkel open source-processtyring skrevet i Python, som kan bruges til at køre så mange kopier af en proces som nødvendigt og overvåge deres tilstand. Nedenfor viser vi dig, hvordan du installerer og konfigurerer Supervisor med Ubuntu 20.04 som eksempel.
Den nemmeste måde at få fat i programmet på er at installere det fra de officielle repositories. For at gøre dette skal du køre kommandoen:
$ sudo apt install supervisor
Hvis du vil have programmet til at køre hele tiden, skal du tilføje det til din autoloader og køre det. Udfør kommandoen:
$ sudo systemctl enable supervisor --now
Derefter kan du se status ved hjælp af kommandoen:
$ sudo systemctl status supervisor
Konfigurationsfilen ligger i /etc/supervisor/supervisord.conf.
Det er også her, de grundlæggende indstillinger findes. Det er bedre at bruge biblioteket /etc/supervisor/conf
.d/ til at konfigurere kørende processer. Hovedkonfigurationsfilen kan efterlades som standard. Lad os se, hvordan man opretter konfigurationsfiler til programmer. Syntaksen for et afsnit for en enkelt proces ser sådan ud:
variabel navn værdi
For hver proces er det nødvendigt at angive sådanne variabler, for at den automatisk kan starte og gendannes efter et nedbrud:
directory
- arbejdsmappe;kommando
til at starte processen; user
- bruger, som processen skal startes på vegne af;
autostart
- om processen skal startes automatisk; autorestart
- om processen skal genstartes;
Der er dog mange flere indstillinger til rådighed, og her er nogle af dem, som vil blive diskuteret i denne artikel:
priority
- prioritet for den proces, der skal startes;
environment
- miljøvariabler, der skal sendes til processen;
stdout_logfile
- hvor processens stdout-out skal omdirigeres hen;
stderr_logfile
- hvor processens stderr-output skal omdirigeres hen; process_name
- procesnavn med mulighed for at erstatte kopinummer;
numprocs
- antal kopier af den proces, der skal startes;
startretries
- antal forsøg på at starte programmet;
redirect_stderr
- omdirigering af procesfejloutput til supervisoroutput;
redirect_stdout
- omdirigerer procesoutput til supervisor-output.For at få en bedre forståelse og et eksempel, lad os udføre et PHP-script, som bare vil hænge i baggrunden:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Du kan oprette en separat supervisor-konfigurationsfil til processen. Du kan indsætte konfigurationen lige i slutningen af hovedkonfigurationsfilen, men det er bedre ikke at gøre det. Det er bedre at oprette en separat konfigurationsfil for hvert program i /etc/supervisor/conf
.d/ med navnet *.conf. For dette program vil filen f.eks. se sådan ud:
$ 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
Derefter skal du genstarte supervisor, det kan gøres med systemctl:
$ sudo systemctl restart supervisor
Eller med supervisorctl-værktøjet
:
$ sudo supervisorctl reload
Du kan også se status for de konfigurerede processer ved hjælp af kommandoen:
Hvis processen er i RUNNING-status, er alt godt, og den blev startet med succes. Men i dette tilfælde kører processen i en enkelt instans, og ofte har man brug for at køre flere kopier af den samme proces. Til det formål kan vi bruge parametrene process_name
og numprocs
. Med den første kan man ændre procesnavnet, så det indeholder kopinummeret, og med den anden kan man angive, hvor mange kopier der skal køres.
Variablen process_name
indeholder normalt et python-strengformateringsmønster, der indeholder programnavnet og procesnummeret: %(program_name)s_%(process_num)02d
. Her står variabelnavnet i parentes efterfulgt af typen. Hvis man f.eks. vil køre det samme program i fire tråde, skal konfigurationsfilen have denne form:
$ 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
Nu skal vi genindlæse supervisorctl
igen, og 4 processer vil køre:
$ sudo supervisorctl status
Samtidig er det muligt at gemme alle de data, som programmet udsender, i logfilen. Parametrene stdout_logfile
og stderr_logfile
bruges til dette formål. Man kan f.eks. lægge logfilen for udførelsen direkte i mappen med programmet.
$ 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
Efter genstart af tjenesten vises logfilerne i mappen med programmet:
På samme måde skal du bruge parametrene redirect_stderr
og redirect_stdout
, hvis du vil omdirigere
output fra dine processer til standard supervisor-output
. Hvis dit program har brug for miljøvariabler, kan du sende dem ind ved hjælp af miljøparameteren. Variabler skal skrives med komma. Et eksempel:
$ environment=DISPLAY=":1",HOME="/root"
Efter hver konfigurationsændring skal du huske at genstarte supervisor for at anvende ændringerne. Værktøjet supervisorctl kan bruges til at kontrollere processer. Som du allerede har indset, skal du udføre for at se listen over processer:
$ sudo supervisorctl status
Når du kender navnet på processen, kan du genstarte den, f.eks. process :process_00
:
$ sudo supervisorctl restart process:process_00
Stop:
$ sudo supervisorctl stop process:process_00
Eller starte:
$ sudo supervisorctl start process:process_00
Alternativt kan man forbinde til processen og se, hvad den sender til stdout/stderr
ved hjælp af kommandoen fg
:
$ sudo supervisorctl fg process:process_00
Vi har set på, hvordan supervisor
konfigureres, og hvordan man bruger processtyringssoftwaren.