Pentru a gestiona procesoarele în Linux există sisteme de inițializare precum systemd. Dacă aveți nevoie de o soluție mai simplă, un program care poate gestiona procesele aplicației dumneavoastră, fie pe sistem, fie într-un container Docker. Un astfel de program există - este supervisor. Este un manager de procese open-source simplu din punct de vedere funcțional, scris în Python, care poate fi utilizat pentru a rula cât mai multe copii ale unui proces după cum este necesar și pentru a monitoriza starea acestora. Mai jos vă vom arăta cum să instalați și să configurați Supervisor folosind Ubuntu 20.04 ca exemplu.
Cel mai simplu mod de a obține programul este să îl instalați din depozitele oficiale. Pentru a face acest lucru, trebuie să executați comanda:
$ sudo apt install supervisor
Dacă doriți ca programul să ruleze tot timpul, trebuie să îl adăugați la autoloader și să îl executați. Executați:
$ sudo systemctl enable supervisor --now
Apoi, puteți vizualiza starea utilizând comanda:
$ sudo systemctl status supervisor
Fișierul de configurare se află la adresa /etc/supervisor/supervisord.conf.
Acesta este, de asemenea, locul în care se află setările de bază. Este mai bine să utilizați directorul /etc/supervisor/conf.d/
pentru a configura procesele care rulează .
Fișierul de configurare principal poate fi lăsat implicit. Să vedem cum să creăm fișiere de configurare pentru programe. Sintaxa unei secțiuni pentru un singur proces arată astfel:
nume variabilă valoare
Pentru fiecare proces este necesar să se treacă astfel de variabile pentru ca acesta să pornească automat și să se recupereze după o blocare:
directory
- directorul de lucru;
command
- comanda de pornire a procesului; user
- utilizator, în numele căruia va fi pornit procesul;
autostart
- dacă procesul ar trebui să fie pornit automat; autorestart
- dacă procesul trebuie să fie repornit;
Cu toate acestea, există mult mai multe setări disponibile, iată câteva dintre ele care vor fi discutate în acest articol:
priority
- prioritatea procesului care urmează să fie pornit;
environment
- variabilele de mediu care urmează să fie transmise procesului;
stdout_logfile
- unde să redirecționați ieșirea stdout a procesului;
stderr_logfile
- unde se redirecționează ieșirea stderr a procesului; process_name
- numele procesului, cu posibilitatea de a înlocui numărul de copii;
numprocs
- numărul de copii ale procesului care urmează să fie pornit;
startretries
- numărul de încercări de a porni programul;
redirect_stderr
- redirecționează ieșirea de eroare a procesului către ieșirea supervizorului;
redirect_stdout
- redirecționează ieșirea procesului către ieșirea supervizorului.Pentru o mai bună înțelegere și exemplificare, să executăm un script PHP care va sta în fundal:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Puteți crea un fișier de configurare a supervizorului separat pentru proces. Puteți introduce configurația chiar la sfârșitul fișierului de configurare principal, dar este mai bine să nu faceți acest lucru. Este mai bine să creați un fișier de configurare separat pentru fiecare program în /etc/supervisor/conf.d/
cu numele *.conf. De exemplu, pentru acest program, acest fișier va arăta astfel:
$ 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
Apoi trebuie să reporniți supervisor, acest lucru se poate face cu systemctl:
$ sudo systemctl restart supervisor
Sau cu utilitarul supervisorctl
:
$ sudo supervisorctl reload
De asemenea, puteți vedea starea proceselor configurate cu ajutorul comenzii:
Dacă procesul este în stare de RUNNING, este în regulă și a fost pornit cu succes. Dar în acest caz procesul rulează într-o singură instanță și destul de des trebuie să rulați mai multe copii ale aceluiași proces. În acest scop, putem utiliza parametrii process_name
și numprocs
. Primul vă permite să modificați numele procesului pentru a conține numărul de copii, iar al doilea vă permite să specificați câte copii ar trebui să fie executate.
Variabila process_name
conține de obicei un model de formatare a șirului de caractere python care conține numele programului și numărul procesului: %(nume_program)s_%(număr_proces)02d
. Aici, numele variabilei este în paranteze, urmat de tipul acesteia. De exemplu, pentru a rula același program în patru fire de execuție, fișierul de configurare ar trebui să fie setat în această 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
Acum trebuie să reîncărcăm din nou supervisorctl
și vor rula 4 procese:
$ sudo supervisorctl status
În același timp, este posibil să se salveze toate datele generate de program în fișierul jurnal. Parametrii stdout_logfile
și stderr_logfile
sunt utilizați în acest scop. De exemplu, puteți emite fișierul jurnal al execuției acestuia direct în folderul cu programul.
$ 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
După repornirea serviciului, jurnalele vor apărea în folderul cu programul:
În mod similar, dacă doriți să redirecționați
ieșirea proceselor dvs. către ieșirea standard a supervizorului, trebuie să utilizați parametrii redirect_stderr
și redirect_stdout.
Dacă programul dvs. are nevoie de variabile de mediu, le puteți introduce folosind parametrul environment. Variabilele trebuie să fie scrise cu virgulă. De exemplu:
$ environment=DISPLAY=":1",HOME="/root"
După fiecare modificare a configurației, nu uitați să reporniți supervisor pentru a aplica modificările. Utilitarul supervisorctl poate fi utilizat pentru a controla procesele. După cum v-ați dat seama deja, pentru a vedea lista de procese trebuie să executați:
$ sudo supervisorctl status
Apoi, cunoscând numele procesului, îl puteți reporni, de exemplu process:process_00
:
$ sudo supervisorctl restart process:process_00
Stop:
$ sudo supervisorctl stop process:process_00
Sau porniți:
$ sudo supervisorctl start process:process_00
Alternativ, vă puteți conecta la proces și puteți vedea ce scoate pe stdout/stderr
folosind comanda fg
:
$ sudo supervisorctl fg process:process_00
Am analizat modul în care este configurat supervizorul
și cum se utilizează software-ul de gestionare a proceselor.