Om processoren in Linux te beheren zijn er initialisatiesystemen zoals systemd. Als je een eenvoudigere oplossing nodig hebt, is een programma dat de processen van je applicatie kan beheren, op het systeem of in een Docker-container. Zo'n programma bestaat - het is supervisor. Het is een functioneel eenvoudige open-source procesmanager geschreven in Python, die kan worden gebruikt om zoveel kopieën van een proces te draaien als nodig is en hun status te bewaken. Hieronder laten we zien hoe je Supervisor installeert en configureert, met Ubuntu 20.04 als voorbeeld.
De makkelijkste manier om het programma te krijgen is door het te installeren vanuit de officiële repositories. Om dit te doen, moet je het commando uitvoeren:
$ sudo apt install supervisor
Als je wilt dat het programma altijd draait, moet je het toevoegen aan je autoloader en het uitvoeren. Uitvoeren:
$ sudo systemctl enable supervisor --now
Vervolgens kun je de status bekijken met het commando:
$ sudo systemctl status supervisor
Het configuratiebestand staat in /etc/supervisor/supervisord.conf.
Dit is ook waar de basisinstellingen staan. Het is beter om de map /etc/supervisor/conf.d/
te gebruiken om lopende processen te configureren .
Het hoofdconfiguratiebestand kan standaard blijven staan. Laten we eens kijken hoe configuratiebestanden voor programma's gemaakt moeten worden. De syntaxis van een sectie voor een enkel proces ziet er als volgt uit:
variabele naam waarde
Voor elk proces is het nodig om zulke variabelen door te geven zodat het automatisch start en herstelt na een crash:
directory
- werkdirectory;
commando
- commando om het proces te starten; user
- gebruiker namens wie het proces wordt gestart;
autostart
- of het proces automatisch gestart moet worden; autorestart
- of het proces opnieuw gestart moet worden;
Er zijn echter veel meer instellingen beschikbaar, hier zijn er een paar die in dit artikel worden besproken:
priority
- prioriteitvan het
te starten proces;
environment
- omgevingsvariabelen die aan het proces moeten worden doorgegeven;
stdout_logfile
- waar de stdout uitvoer van het proces naartoe geleid moet worden;
stderr_logfile
- waar de stderr uitvoer van het proces naartoe geleid moet worden; process_name
- procesnaam, met de mogelijkheid om het kopieernummer te vervangen;
numprocs
- aantal kopieën van het proces dat gestart moet worden;
startretries
- aantal pogingen om het programma te starten;
redirect_stderr
- stuur de uitvoer van procesfouten door naar de uitvoer van de supervisor;
redirect_stdout
- procesuitvoer omleiden naar supervisoruitvoer.Laten we voor een beter begrip en voorbeeld een PHP-script uitvoeren dat gewoon op de achtergrond blijft hangen:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Je kunt een apart supervisorconfiguratiebestand maken voor het proces. Je kunt de configuratie helemaal aan het einde van het hoofdconfiguratiebestand invoegen, maar het is beter om dat niet te doen. Het is beter om voor elk programma een apart configuratiebestand aan te maken in /etc/supervisor/conf.d/
met de naam *.conf. Voor dit programma ziet dit bestand er bijvoorbeeld zo uit:
$ 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
Vervolgens moet je supervisor herstarten, dit kan met systemctl:
$ sudo systemctl restart supervisor
Of met het hulpprogramma supervisorctl
:
$ sudo supervisorctl reload
Je kunt ook de status van de geconfigureerde processen zien met het commando:
Als het proces in de status RUNNING staat, is dat allemaal goed en is het succesvol gestart. Maar in dit geval draait het proces in een enkele instantie, en vaak moet je meerdere kopieën van hetzelfde proces draaien. Hiervoor kunnen we de parameters process_name
en numprocs
gebruiken. Met de eerste kun je de procesnaam aanpassen zodat deze het kopieernummer bevat, en met de tweede kun je opgeven hoeveel kopieën er gedraaid moeten worden.
De process_name
variabele bevat meestal een python tekenreeksopmaakpatroon dat de programmanaam en het procesnummer bevat: %(program_name)s_%(process_num)02d
. Hier staat de naam van de variabele tussen haakjes, gevolgd door het type. Om bijvoorbeeld hetzelfde programma in vier threads te draaien, moet het configuratiebestand op deze manier worden ingesteld:
$ 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
Nu moeten we supervisorctl
opnieuw laden en er zullen 4 processen draaien:
$ sudo supervisorctl status
Tegelijkertijd is het mogelijk om alle gegevens die door het programma worden uitgevoerd op te slaan in het logbestand. Hiervoor worden de parameters stdout_logfile
en stderr_logfile
gebruikt. Je kunt bijvoorbeeld het logbestand van de uitvoering direct uitvoeren in de map met het programma.
$ 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
Na het herstarten van de service verschijnen de logbestanden in de map met het programma:
Op dezelfde manier, als je de uitvoer van je processen wilt omleiden
naar de standaard uitvoer van de supervisor, moet je de parameters redirect_stderr
en redirect_stdout gebruiken.
Als je programma omgevingsvariabelen nodig heeft, kun je die doorgeven met de omgevingsparameter. Variabelen moeten met komma's worden geschreven. Bijvoorbeeld:
$ environment=DISPLAY=":1",HOME="/root"
Vergeet niet na elke configuratiewijziging supervisor opnieuw te starten om de wijzigingen toe te passen. Het hulpprogramma supervisorctl kan gebruikt worden om processen te besturen. Zoals je je al hebt gerealiseerd, moet je de lijst met processen uitvoeren om deze te zien:
$ sudo supervisorctl status
Dan, wetende de naam van het proces, kun je het herstarten, bijvoorbeeld process:process_00
:
$ sudo supervisorctl restart process:process_00
Stop:
$ sudo supervisorctl stop process:process_00
Of starten:
$ sudo supervisorctl start process:process_00
Als alternatief kun je verbinding maken met het proces en zien wat het uitvoert naar stdout/stderr
met het commando fg
:
$ sudo supervisorctl fg process:process_00
We hebben bekeken hoe supervisor
wordt geconfigureerd en hoe de procesbeheersoftware wordt gebruikt.