A Linuxban a processzorok kezelésére vannak inicializáló rendszerek, mint például a systemd. Ha egyszerűbb megoldásra van szükséged, egy olyan programra, amely képes kezelni az alkalmazásod folyamatait, akár a rendszeren, akár egy Docker konténerben. Ilyen program létezik - ez a supervisor. Ez egy Python nyelven írt, funkcionálisan egyszerű, nyílt forráskódú folyamatkezelő, amellyel egy folyamatból annyi másolatot lehet futtatni, amennyit csak szükséges, és figyelemmel kísérhetjük azok állapotát. Az alábbiakban bemutatjuk, hogyan telepíthetjük és konfigurálhatjuk a Supervisort az Ubuntu 20.04-es verziószámú Ubuntu példáján.
A legegyszerűbben úgy juthatunk hozzá a programhoz, ha a hivatalos tárolókból telepítjük. Ehhez a parancsot kell futtatni:
$ sudo apt install supervisor
Ha azt szeretné, hogy a program állandóan fusson, akkor hozzá kell adnia az automatikus betöltőjéhez és futtatnia kell. Végrehajtás:
$ sudo systemctl enable supervisor --now
Ezután a parancs segítségével megtekintheti az állapotot:
$ sudo systemctl status supervisor
A konfigurációs fájl az /etc/supervisor/supervisord.conf
címen található. Itt találhatók az alapbeállítások is. A futó folyamatok konfigurálásához célszerűbb az /etc/supervisor/conf.d/
könyvtárat használni. A fő konfigurációs fájl alapértelmezés szerint elhagyható. Lássuk, hogyan hozhatunk létre konfigurációs fájlokat a programok számára. Az egyetlen folyamatra vonatkozó szakasz szintaxisa így néz ki:
változó neve érték
Minden egyes folyamathoz át kell adni ilyen változókat, hogy automatikusan elinduljon és helyreálljon egy összeomlás után:
directory
- munkakönyvtár;
command
- a folyamat indításának parancsa; user
- a felhasználó, akinek a nevében a folyamat elindul;
autostart
- a folyamat automatikus indítása; autorestart
- a folyamat újrainduljon-e;
Azonban még sok más beállítás is rendelkezésre áll, ezek közül néhányat mutatunk be, amelyeket ebben a cikkben tárgyalunk:
priority
- az indítandó folyamat prioritása;
environment
- a folyamatnak átadandó környezeti változók;
stdout_logfile
- hová irányítja át a folyamat stdout kimenetét;
stderr_logfile
- hová kell átirányítani a folyamat stderr kimenetét; process_name
- a folyamat neve, a másolatszám helyettesítésének lehetőségével;
numprocs
- az indítandó folyamat másolatainak száma;
startretries
- a program indítási kísérletek száma;
redirect_stderr
- a folyamat hibakimenetének átirányítása a felügyelő kimenetére;
redirect_stdout
- a folyamat kimenetének átirányítása a felügyelő kimenetére.A jobb megértés és a példa kedvéért futtassunk egy PHP szkriptet, amely csak a háttérben fog lógni:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
A folyamathoz külön supervisor konfigurációs fájlt hozhatunk létre. A konfigurációt beillesztheti közvetlenül a fő konfigurációs fájl végére, de jobb, ha ezt nem teszi. Jobb, ha minden egyes programhoz külön konfigurációs fájlt hozunk létre az /etc/supervisor/conf.d/
állományban *.conf néven. Például ehhez a programhoz ez a fájl így fog kinézni:
$ 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
Ezután újra kell indítani a supervisort, ezt a systemctl segítségével lehet megtenni:
$ sudo systemctl restart supervisor
Vagy a supervisorctl
segédprogrammal:
$ sudo supervisorctl reload
A konfigurált folyamatok állapotát a következő paranccsal is láthatjuk:
Ha a folyamat RUNNING státuszban van, akkor minden rendben van, és sikeresen elindult. De ebben az esetben a folyamat egyetlen példányban fut, és elég gyakran szükség van ugyanazon folyamat több példányának futtatására. Erre a célra használhatjuk a process_name
és numprocs
paramétereket. Az elsővel módosíthatjuk a folyamat nevét úgy, hogy tartalmazza a másolatok számát, a másodikkal pedig megadhatjuk, hogy hány másolatot futtassunk.
A process_name
változó általában egy python sztring formázási mintát tartalmaz, amely a program nevét és a folyamat számát tartalmazza: %(program_név)s_%(folyamat_szám)02d
. Itt a változó neve zárójelben van, amelyet a típusa követ. Ha például ugyanazt a programot négy szálon szeretnénk futtatni, a konfigurációs fájlban ezt a formát kell beállítani:
$ 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
Most újra be kell töltenünk a supervisorctl-t
, és már 4 folyamat fog futni:
$ sudo supervisorctl status
Ugyanakkor lehetőség van arra, hogy a program által kimenő összes adatot a naplófájlba mentsük. Erre a célra az stdout_logfile
és az stderr_logfile
paraméterek szolgálnak. Így például a program végrehajtásáról készült naplófájlt közvetlenül a program mappájába adhatja ki.
$ 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
A szolgáltatás újraindítása után a naplófájlok a program mappájában fognak megjelenni:
Hasonlóképpen, ha a folyamatok kimenetét át
akarja irányítani
a szabványos felügyelői kimenetre, akkor a redirect_stderr
és redirect_stdout
paramétereket kell használnia. Ha a programodnak szüksége van környezeti változókra, akkor azokat a környezeti paraméterrel adhatod át. A változókat vesszővel kell írni. Például:
$ environment=DISPLAY=":1",HOME="/root"
Minden egyes konfigurációs módosítás után ne felejtse el újraindítani a supervisort, hogy a módosítások érvényesüljenek. A supervisorctl segédprogram használható a folyamatok vezérlésére. Mint már rájött, a folyamatok listájának megtekintéséhez a futtatására van szükség:
$ sudo supervisorctl status
Ezután a folyamat nevének ismeretében újraindíthatja azt, például process:process_00
:
$ sudo supervisorctl restart process:process_00
Leállítása:
$ sudo supervisorctl stop process:process_00
Vagy indítsa el:
$ sudo supervisorctl start process:process_00
Alternatívaként csatlakozhatsz a folyamathoz, és megnézheted, hogy mit ad ki az stdout/stderr-re
az fg
parancs segítségével:
$ sudo supervisorctl fg process:process_00
Megnéztük, hogyan kell a supervisort
konfigurálni, és hogyan kell használni a folyamatkezelő szoftvert.