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.