Na správu procesorov v Linuxe slúžia inicializačné systémy ako systemd. Ak potrebujete jednoduchšie riešenie, program, ktorý dokáže spravovať procesy vašej aplikácie, buď v systéme, alebo v kontajneri Docker. Takýto program existuje - je ním supervisor. Je to funkčne jednoduchý open-source správca procesov napísaný v jazyku Python, pomocou ktorého možno spustiť toľko kópií procesu, koľko je potrebné, a monitorovať ich stav. Nižšie vám ukážeme, ako nainštalovať a nakonfigurovať program Supervisor na príklade Ubuntu 20.04.
Najjednoduchší spôsob, ako získať program, je nainštalovať ho z oficiálnych repozitárov. Na to je potrebné spustiť príkaz:
$ sudo apt install supervisor
Ak chcete, aby sa program spúšťal neustále, je potrebné ho pridať do automatického zaraďovača a spustiť. Spustenie: Ak chcete spustiť program, kliknite na položku Spustiť:
$ sudo systemctl enable supervisor --now
Ďalej môžete zobraziť stav pomocou príkazu:
$ sudo systemctl status supervisor
Konfiguračný súbor sa nachádza na adrese /etc/supervisor/supervisord.conf.
Tu sa nachádzajú aj základné nastavenia. Na konfiguráciu spustených procesov je lepšie použiť adresár /etc/supervisor/conf.d/
. Hlavný konfiguračný súbor môžete ponechať v predvolenom nastavení. Pozrime sa, ako vytvoriť konfiguračné súbory pre programy. Syntax časti pre jeden proces vyzerá takto:
názov premennej hodnota
Pre každý proces je potrebné odovzdať také premenné, aby sa automaticky spustil a zotavil po páde:
directory
- pracovný adresár;
command
- príkaz na spustenie procesu; user -používateľ
, v mene ktorého sa proces spustí;
autostart
- či sa má proces automaticky spustiť; autorestart
- či sa má proces
znovu
spustiť;Nastavení je však k dispozícii oveľa viac, tu sú niektoré z nich, o ktorých bude reč v tomto článku:
Priorita
- priorita procesu, ktorý sa má spustiť;
environment
- premenné prostredia, ktoré sa majú odovzdať procesu;
stdout_logfile
- kam sa má presmerovať výstup stdout procesu;
stderr_logfile
- kam sa má presmerovať výstup stderr procesu; process_name
- názov procesu s možnosťou nahradiť číslo kópie;
numprocs
- počet kópií procesu, ktorý sa má spustiť;
startretries
- počet pokusov o spustenie programu;
redirect_stderr
- presmerovanie chybového výstupu procesu na výstup supervízora;
redirect_stdout
- presmerovanie výstupu procesu na výstup supervízora.Pre lepšie pochopenie a príklad spustíme skript PHP, ktorý bude len visieť na pozadí:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Pre proces môžete vytvoriť samostatný konfiguračný súbor supervízora. Konfiguráciu môžete vložiť priamo na koniec hlavného konfiguračného súboru, ale je lepšie to nerobiť. Lepšie je vytvoriť samostatný konfiguračný súbor pre každý program v /etc/supervisor/conf.d/
s názvom *.conf. Napríklad pre tento program bude tento súbor vyzerať takto:
$ 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
Potom je potrebné reštartovať program supervisor, čo je možné vykonať pomocou systemctl:
$ sudo systemctl restart supervisor
alebo pomocou nástroja supervisorctl
:
$ sudo supervisorctl reload
Stav nakonfigurovaných procesov si môžete pozrieť aj pomocou príkazu:
Ak je proces v stave RUNNING, je všetko v poriadku a bol úspešne spustený. V tomto prípade však proces beží v jednej inštancii a pomerne často je potrebné spustiť viacero kópií toho istého procesu. Na tento účel môžeme použiť parametre process_name
a numprocs
. Prvý z nich umožňuje upraviť názov procesu tak, aby obsahoval číslo kópie, a druhý umožňuje určiť, koľko kópií sa má spustiť.
Premenná process_name
zvyčajne obsahuje vzor formátovania reťazca jazyka python, ktorý obsahuje názov programu a číslo procesu: %(názov_programu)s_%(číslo_procesu)02d
. Tu je názov premennej v zátvorkách, za ktorým nasleduje jej typ. Ak chcete napríklad spustiť ten istý program v štyroch vláknach, konfiguračný súbor by mal mať tento tvar:
$ 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
Teraz musíme znovu načítať supervisorctl
a budú spustené 4 procesy:
$ sudo supervisorctl status
Zároveň je možné uložiť všetky údaje, ktoré program vypisuje, do logovacieho súboru. Na tento účel sa používajú parametre stdout_logfile
a stderr_logfile
. Môžete napríklad vypisovať logovací súbor jeho vykonávania priamo do priečinka s programom.
$ 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
Po reštartovaní služby sa protokoly objavia v priečinku s programom:
Podobne, ak chcete presmerovať
výstup svojich procesov na štandardný výstup supervízora, mali by ste použiť parametre redirect_stderr
a redirect_stdout
. Ak váš program potrebuje nejaké premenné prostredia, môžete ich odovzdať pomocou parametra prostredia. Premenné by sa mali zapisovať s čiarkami. Napríklad:
$ environment=DISPLAY=":1",HOME="/root"
Po každej zmene konfigurácie nezabudnite reštartovať program supervisor, aby sa zmeny uplatnili. Na riadenie procesov možno použiť nástroj supervisorctl. Ako ste si už uvedomili, na zobrazenie zoznamu procesov je potrebné vykonať:
$ sudo supervisorctl status
Potom, keď poznáte názov procesu, môžete ho reštartovať, napríklad process:process_00
:
$ sudo supervisorctl restart process:process_00
Zastaviť:
$ sudo supervisorctl stop process:process_00
alebo spustiť:
$ sudo supervisorctl start process:process_00
Prípadne sa môžete pripojiť k procesu a pozrieť si, čo vypíše na stdout/stderr
pomocou príkazu fg
:
$ sudo supervisorctl fg process:process_00
Pozreli sme sa na to, ako sa konfiguruje program supervisor
a ako sa používa softvér na správu procesov.