Procesoriams valdyti "Linux" yra inicializavimo sistemos, pavyzdžiui, systemd. Jei jums reikia paprastesnio sprendimo - programos, galinčios valdyti jūsų programos procesus sistemoje arba "Docker" konteineryje. Tokia programa egzistuoja - tai "Supervisor". Tai funkcionaliai paprasta atvirojo kodo procesų tvarkyklė, parašyta "Python" kalba, kurią galima naudoti paleisti tiek procesų kopijų, kiek reikia, ir stebėti jų būseną. Toliau parodysime, kaip įdiegti ir sukonfigūruoti "Supervisor", kaip pavyzdį naudodami "Ubuntu 20.04".
Paprasčiausias būdas gauti programą - įdiegti ją iš oficialių saugyklų. Norėdami tai padaryti, turite paleisti komandą:
$ sudo apt install supervisor
Jei norite, kad programa veiktų visą laiką, ją reikia įtraukti į automatinio paleidimo programą ir paleisti. Įvykdyti:
$ sudo systemctl enable supervisor --now
Toliau galite peržiūrėti būseną naudodami komandą:
$ sudo systemctl status supervisor
Konfigūracijos failas yra adresu /etc/supervisor/supervisord.conf.
Čia taip pat yra pagrindiniai nustatymai. Vykdomiems procesams konfigūruoti geriau naudoti katalogą /etc/supervisor/conf.d/
. Pagrindinį konfigūracijos failą galima palikti pagal numatytuosius nustatymus. Pažiūrėkime, kaip sukurti programų konfigūracijos failus. Vieno proceso skirsnio sintaksė atrodo taip:
kintamojo pavadinimas reikšmė
Kiekvienam procesui būtina perduoti tokius kintamuosius, kad jis automatiškai įsijungtų ir atsigautų po gedimo:
katalogas
- darbinis katalogas;
komanda
- proceso paleidimo komanda; user -vartotojas
, kurio vardu bus paleistas procesas;
autostart
- ar procesas turi būti paleistas automatiškai; autorestart
- ar procesas turėtų būti paleistas iš
naujo
;Tačiau yra daug daugiau nustatymų, čia pateikiami kai kurie iš jų, kurie bus aptarti šiame straipsnyje:
Prioritetas
- paleidžiamo proceso prioritetas;
aplinka
- aplinkos kintamieji, kurie turi būti perduodami procesui;
stdout_logfile
- kur nukreipti proceso stdout išvestį;
stderr_logfile
- kur nukreipti proceso stderr išvestį; process_name
- proceso pavadinimas, su galimybe pakeisti kopijos numerį;
numprocs
- paleistinų proceso kopijų skaičius;
startretries
- bandymų paleisti programą skaičius;
redirect_stderr
- nukreipti proceso klaidų išvestį į prižiūrėtojo išvestį;
redirect_stdout
- nukreipti proceso išvestį į prižiūrėtojo išvestį.Kad geriau suprastume ir geriau pateiktume pavyzdį, paleiskime PHP scenarijų, kuris tiesiog kabės fone:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Procesui galite sukurti atskirą prižiūrėtojo konfigūracijos failą. Konfigūraciją galite įterpti pačioje pagrindinio konfigūracijos failo pabaigoje, tačiau geriau to nedaryti. Kiekvienai programai geriau sukurti atskirą konfigūracijos failą /etc/supervisor/conf.d/
su pavadinimu *.conf. Pavyzdžiui, šiai programai šis failas atrodys taip:
$ 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
Tada reikia iš naujo paleisti "Supervisor", tai galima padaryti naudojant systemctl:
$ sudo systemctl restart supervisor
arba naudodami supervisorctl
įrankį:
$ sudo supervisorctl reload
Sukonfigūruotų procesų būseną taip pat galite pamatyti naudodami komandą:
Jei proceso būsena yra RUNNING, vadinasi, viskas gerai ir jis sėkmingai paleistas. Tačiau šiuo atveju procesas vykdomas vienu egzemplioriumi, o gana dažnai reikia paleisti kelias to paties proceso kopijas. Šiam tikslui galime naudoti parametrus process_name
ir numprocs
. Pirmuoju galima pakeisti proceso pavadinimą, kad jame būtų įrašytas kopijos numeris, o antruoju - nurodyti, kiek kopijų turėtų būti paleista.
Kintamajame process_name
paprastai įrašomas python eilutės formatavimo šablonas, kuriame yra programos pavadinimas ir proceso numeris: %(program_name)s_%(process_num)02d.
Čia kintamojo pavadinimas yra skliausteliuose, o po jo nurodomas tipas. Pavyzdžiui, norint paleisti tą pačią programą keturiomis gijomis, konfigūracijos faile reikia nustatyti tokią 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
Dabar turime vėl įkelti supervisorctl
ir bus paleisti 4 procesai:
$ sudo supervisorctl status
Tuo pačiu metu galima įrašyti visus programos išvedamus duomenis į žurnalo failą. Šiam tikslui naudojami parametrai stdout_logfile
ir stderr_logfile
. Pavyzdžiui, galite išvesti programos vykdymo žurnalo failą tiesiai į aplanką su programa.
$ 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
Iš naujo paleidus paslaugą, žurnalo įrašai bus rodomi aplanke su programa:
Panašiai, jei norite nukreipti
savo procesų išvestį į standartinę prižiūrėtojo išvestį, turėtumėte naudoti parametrus redirect_stderr
ir redirect_stdout
. Jei jūsų programai reikalingi kokie nors aplinkos kintamieji, juos galite perduoti naudodami aplinkos parametrą. Kintamuosius reikia rašyti su kableliais. Pavyzdžiui:
$ environment=DISPLAY=":1",HOME="/root"
Po kiekvieno konfigūracijos pakeitimo nepamirškite iš naujo paleisti "Supervisor", kad pakeitimai būtų pritaikyti. Procesams valdyti galima naudoti supervisorctl įrankį. Kaip jau supratote, norėdami pamatyti procesų sąrašą, turite vykdyti:
$ sudo supervisorctl status
Tada, žinodami proceso pavadinimą, galite jį paleisti iš naujo, pavyzdžiui, process:process_00
:
$ sudo supervisorctl restart process:process_00
Sustabdyti:
$ sudo supervisorctl stop process:process_00
arba paleisti:
$ sudo supervisorctl start process:process_00
Taip pat galite prisijungti prie proceso ir pamatyti, ką jis išveda į stdout/stderr
, naudodami komandą fg
:
$ sudo supervisorctl fg process:process_00
Apžvelgėme, kaip sukonfigūruotas "Supervisor"
ir kaip naudotis procesų valdymo programine įranga.