Pro správu procesorů v Linuxu existují inicializační systémy, jako je systemd. Pokud potřebujete jednodušší řešení, můžete použít program, který dokáže spravovat procesy vaší aplikace, a to buď v systému, nebo v kontejneru Docker. Takový program existuje - je jím supervisor. Jedná se o funkčně jednoduchý open-source správce procesů napsaný v jazyce Python, který lze použít ke spuštění libovolného počtu kopií procesu a sledování jejich stavu. Níže si ukážeme, jak Supervisor nainstalovat a nakonfigurovat na příkladu Ubuntu 20.04.
Nejjednodušší způsob, jak program získat, je nainstalovat jej z oficiálních repozitářů. K tomu je třeba spustit příkaz:
$ sudo apt install supervisor
Pokud chcete, aby program běžel neustále, musíte jej přidat do automatického spouštěče a spustit. Spustit: V případě, že je program spuštěn, můžete jej spustit:
$ sudo systemctl enable supervisor --now
Dále si můžete zobrazit stav pomocí příkazu:
$ sudo systemctl status supervisor
Konfigurační soubor se nachází na adrese /etc/supervisor/supervisord.conf.
Zde se také nachází základní nastavení. Pro konfiguraci běžících procesů je lepší použít adresář /etc/supervisor/conf.d/
. Hlavní konfigurační soubor lze ponechat ve výchozím nastavení. Podívejme se, jak vytvořit konfigurační soubory pro programy. Syntaxe oddílu pro jeden proces vypadá následovně:
název proměnné hodnota
Pro každý proces je nutné předat takové proměnné, aby se automaticky spustil a zotavil po pádu:
directory
- pracovní adresář;
příkaz
- příkaz pro spuštění procesu; user
- uživatel, jehož jménem bude proces spuštěn;
autostart
- zda se má proces automaticky spustit; autorestart
- zda se má proces
znovu
spustit;Nastavení je však k dispozici mnohem více, zde jsou uvedena některá z nich, o kterých bude pojednáno v tomto článku:
Priorita
- priorita procesu, který má být spuštěn;
prostředí
- proměnné prostředí, které mají být procesu předány;
stdout_logfile
- kam se má přesměrovat výstup stdout procesu;
stderr_logfile
- kam se má přesměrovat výstup stderr procesu; process_name
- název procesu s možností nahradit číslo kopie;
numprocs
- počet kopií procesu, který má být spuštěn;
startretries
- počet pokusů o spuštění programu;
redirect_stderr
- přesměrování chybového výstupu procesu na výstup supervizora;
redirect_stdout
- přesměruje výstup procesu na výstup supervizora.Pro lepší pochopení a příklad si spustíme PHP skript, který bude jen viset na pozadí:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Pro tento proces můžete vytvořit samostatný konfigurační soubor supervizoru. Konfiguraci můžete vložit přímo na konec hlavního konfiguračního souboru, ale je lepší to nedělat. Lepší je vytvořit pro každý program samostatný konfigurační soubor v /etc/supervisor/conf.d/
s názvem *.conf. Například pro tento program bude tento soubor vypadat 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
Pak je třeba restartovat supervisor, to lze provést pomocí systemctl:
$ sudo systemctl restart supervisor
Nebo pomocí nástroje supervisorctl
:
$ sudo supervisorctl reload
Stav nakonfigurovaných procesů můžete také zjistit pomocí příkazu:
Pokud je proces ve stavu BĚŽÍ, je vše v pořádku a byl úspěšně spuštěn. V tomto případě však proces běží v jediné instanci a poměrně často je třeba spustit více kopií téhož procesu. K tomuto účelu můžeme použít parametry process_name
a numprocs
. První z nich umožňuje upravit název procesu tak, aby obsahoval číslo kopie, a druhý umožňuje určit, kolik kopií má být spuštěno.
Proměnná process_name
obvykle obsahuje vzor pro formátování řetězce v jazyce python, který obsahuje název programu a číslo procesu: %(program_name)s_%(process_num)02d
. Zde je název proměnné v závorce, za kterou následuje její typ. Chcete-li například spustit stejný program ve čtyřech vláknech, měl by být konfigurační soubor nastaven v tomto tvaru:
$ 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
Nyní musíme znovu načíst supervisorctl
a budou spuštěny 4 procesy:
$ sudo supervisorctl status
Současně je možné uložit všechna data vypsaná programem do souboru protokolu. K tomu slouží parametry stdout_logfile
a stderr_logfile
. Například můžete vypsat soubor protokolu o jeho spuštění přímo do složky s programem.
$ 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 restartování služby se protokoly objeví ve složce s programem:
Podobně pokud chcete přesměrovat
výstup procesů na standardní výstup supervizora, použijte parametry redirect_stderr
a redirect_stdout
. Pokud váš program potřebuje nějaké proměnné prostředí, můžete je předat pomocí parametru prostředí. Proměnné by se měly psát s čárkami. Například:
$ environment=DISPLAY=":1",HOME="/root"
Po každé změně konfigurace nezapomeňte restartovat program supervisor, aby se změny uplatnily. K řízení procesů lze použít nástroj supervisorctl. Jak jste si již uvědomili, pro zobrazení seznamu procesů je třeba spustit:
$ sudo supervisorctl status
Poté, když znáte název procesu, můžete jej restartovat, například process:process_00
:
$ sudo supervisorctl restart process:process_00
Zastavit:
$ sudo supervisorctl stop process:process_00
nebo spustit:
$ sudo supervisorctl start process:process_00
Případně se můžete k procesu připojit a pomocí příkazu fg
zjistit, co vypisuje na stdout/stderr
:
$ sudo supervisorctl fg process:process_00
Podívali jsme se na to, jak se konfiguruje supervizor
a jak používat software pro správu procesů.