For å administrere prosessorer i Linux finnes det initialiseringssystemer som systemd. Hvis du trenger en enklere løsning, kan du bruke et program som kan administrere applikasjonens prosesser, enten på systemet eller i en Docker-container. Et slikt program finnes - det er supervisor. Det er en funksjonelt enkel åpen kildekode-prosessadministrator skrevet i Python, som kan brukes til å kjøre så mange kopier av en prosess som nødvendig og overvåke tilstanden deres. Nedenfor viser vi hvordan du installerer og konfigurerer Supervisor ved å bruke Ubuntu 20.04 som eksempel.
Den enkleste måten å få tak i programmet på, er å installere det fra de offisielle repositoriene. For å gjøre dette må du kjøre kommandoen:
$ sudo apt install supervisor
Hvis du vil at programmet skal kjøre hele tiden, må du legge det til i autoladeren din og kjøre det. Kjør kommandoen:
$ sudo systemctl enable supervisor --now
Deretter kan du se statusen ved hjelp av kommandoen:
$ sudo systemctl status supervisor
Konfigurasjonsfilen ligger i /etc/supervisor/supervisord.conf.
Det er også her de grunnleggende innstillingene ligger. Det er bedre å bruke katalogen /etc/supervisor/conf.d/
til å konfigurere prosesser som kjører. Hovedkonfigurasjonsfilen kan stå igjen som standard. La oss se hvordan du oppretter konfigurasjonsfiler for programmer. Syntaksen for en seksjon for en enkelt prosess ser slik ut:
variabel navn verdi
For hver prosess er det nødvendig å sende slike variabler for at den automatisk skal starte og gjenopprette etter en krasj:
directory
- arbeidskatalog;
kommando
- kommando for å starte prosessen; bruker
- bruker, på vegne av hvilken prosessen vil bli startet;
autostart
- om prosessen skal startes automatisk; autorestart
- om prosessen skal startes på nytt;
Det er imidlertid mange flere innstillinger tilgjengelig, her er noen av dem som vil bli diskutert i denne artikkelen:
priority
- prioritet for prosessen som skal startes;
environment
- miljøvariabler som skal sendes til prosessen;
stdout_logfile
- hvor prosessens stdout-utdata skal omdirigeres;
stderr_logfile
- hvor prosessens stderr-utdata skal omdirigeres; process_name
- prosessnavn, med mulighet for å erstatte kopinummer;
numprocs
- antall kopier av prosessen som skal startes;
startretries
- antall forsøk på å starte programmet;
redirect_stderr
- omdirigerer prosessfeilutdata til supervisorutdata;
redirect_stdout
- omdirigerer prosessutdata til supervisorutdata.For å få en bedre forståelse og et eksempel, la oss kjøre et PHP-skript som bare vil henge i bakgrunnen:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Du kan opprette en egen supervisor-konfigurasjonsfil for prosessen. Du kan sette inn konfigurasjonen helt på slutten av hovedkonfigurasjonsfilen, men det er bedre å ikke gjøre det. Det er bedre å opprette en egen konfigurasjonsfil for hvert program i /etc/supervisor/conf.d/
med navnet *.conf. For dette programmet vil filen for eksempel se slik ut:
$ 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
Deretter må du starte supervisor på nytt, dette kan gjøres med systemctl:
$ sudo systemctl restart supervisor
Eller med verktøyet supervisorctl
:
$ sudo supervisorctl reload
Du kan også se statusen til de konfigurerte prosessene ved hjelp av kommandoen:
Hvis prosessen er i RUNNING-status, er alt bra, og den ble startet vellykket. Men i dette tilfellet kjører prosessen i en enkelt instans, og ofte har du behov for å kjøre flere kopier av samme prosess. Til dette formålet kan vi bruke parameterne process_name
og numprocs
. Med den første kan du endre prosessnavnet slik at det inneholder kopinummeret, og med den andre kan du spesifisere hvor mange kopier som skal kjøres.
Variabelen process_name
inneholder vanligvis et formateringsmønster for python-strenger som inneholder programnavnet og prosessnummeret: %(program_name)s_%(process_num)02d
. Her står variabelnavnet i parentes, etterfulgt av typen. Hvis du for eksempel vil kjøre det samme programmet i fire tråder, bør konfigurasjonsfilen settes på denne måten:
$ 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
Nå må vi laste supervisorctl
på nytt, og fire prosesser vil være i gang:
$ sudo supervisorctl status
Samtidig er det mulig å lagre alle dataene som programmet sender ut, i loggfilen. Parametrene stdout_logfile
og stderr_logfile
brukes til dette formålet. Du kan for eksempel skrive ut loggfilen for utfø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
Etter at du har startet tjenesten på nytt, vil loggene vises i mappen med programmet:
På samme måte kan du bruke parameterne redirect_stderr
og redirect_stdout
hvis du ønsker å omdirigere
utdataene fra prosessene dine til standard supervisor-utdata. Hvis programmet ditt trenger miljøvariabler, kan du sende dem inn ved hjelp av miljøparameteren. Variabler bør skrives med komma. Et eksempel:
$ environment=DISPLAY=":1",HOME="/root"
Etter hver konfigurasjonsendring må du huske å starte supervisor på nytt for å ta endringene i bruk. Verktøyet supervisorctl kan brukes til å kontrollere prosesser. Som du allerede har forstått, må du kjøre for å se listen over prosesser:
$ sudo supervisorctl status
Når du kjenner navnet på prosessen, kan du starte den på nytt, for eksempel process :process_00
:
$ sudo supervisorctl restart process:process_00
Stopp:
$ sudo supervisorctl stop process:process_00
Eller starte:
$ sudo supervisorctl start process:process_00
Alternativt kan du koble deg til prosessen og se hva den sender ut til stdout/stderr
ved hjelp av kommandoen fg
:
$ sudo supervisorctl fg process:process_00
Vi har sett på hvordan supervisor
konfigureres, og hvordan du bruker programvaren for prosessadministrasjon.