Prosessoreiden hallintaan Linuxissa on olemassa systemd:n kaltaisia alustavia järjestelmiä. Jos tarvitset yksinkertaisemman ratkaisun, voit käyttää ohjelmaa, joka voi hallita sovelluksesi prosesseja joko järjestelmässä tai Docker-säiliössä. Tällainen ohjelma on olemassa - se on supervisor. Se on toiminnallisesti yksinkertainen Python-kielellä kirjoitettu avoimen lähdekoodin prosessinhallintaohjelma, jolla voidaan ajaa niin monta kopiota prosessista kuin tarvitaan ja seurata niiden tilaa. Alla näytämme, miten Supervisor asennetaan ja konfiguroidaan käyttäen esimerkkinä Ubuntu 20.04:ää.
Helpoin tapa hankkia ohjelma on asentaa se virallisista arkistoista. Tätä varten sinun on ajettava komento:
$ sudo apt install supervisor
Jos haluat, että ohjelma toimii koko ajan, sinun on lisättävä se automaattiseen latausohjelmaan ja ajettava se. Suorita:
$ sudo systemctl enable supervisor --now
Seuraavaksi voit tarkastella tilaa komennolla:
$ sudo systemctl status supervisor
Konfiguraatiotiedosto sijaitsee osoitteessa /etc/supervisor/supervisord.conf.
Siellä sijaitsevat myös perusasetukset. Käynnissä olevien prosessien konfigurointiin kannattaa käyttää hakemistoa /etc/supervisor/conf.d/.
Pääasetustiedoston voi jättää oletuksena. Katsotaan, miten ohjelmia varten luodaan konfiguraatiotiedostoja. Yksittäisen prosessin osion syntaksi näyttää tältä:
muuttuja nimi arvo
Kullekin prosessille on annettava tällaiset muuttujat, jotta se käynnistyy ja palautuu automaattisesti kaatumisen jälkeen:
directory
- työhakemisto;
command
- komento, jolla prosessi käynnistetään; user
- käyttäjä, jonka puolesta prosessi käynnistetään;
autostart
- käynnistetäänkö prosessi automaattisesti; autorestart
- käynnistetäänkö prosessi uudelleen;
Käytettävissä on kuitenkin paljon muitakin asetuksia, joista joitakin käsitellään tässä artikkelissa:
priority
- käynnistettävän prosessin prioriteetti;
environment
- prosessille välitettävät ympäristömuuttujat;
stdout_logfile
- mihin prosessin stdout-ulostulo ohjataan;
stderr_logfile
- mihin ohjataan prosessin stderr-ulostulo; process_name
- prosessin nimi, joka voidaan korvata kopionumerolla;
numprocs
- käynnistettävän prosessin kopioiden lukumäärä;
startretries
- ohjelman käynnistysyritysten lukumäärä;
redirect_stderr
- ohjaa prosessin virhetulosteet supervisor-ulostuloon;
redirect_stdout
- prosessin ulostulon ohjaaminen valvontaohjelman ulostuloon.Paremman ymmärryksen ja esimerkin vuoksi suoritetaan PHP-skripti, joka vain roikkuu taustalla:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Voit luoda prosessille erillisen supervisor-konfiguraatiotiedoston. Voit lisätä konfiguraation suoraan pääkonfiguraatiotiedoston loppuun, mutta sitä ei kannata tehdä. On parempi luoda jokaiselle ohjelmalle oma konfigurointitiedosto /etc/supervisor/conf.d/:
een nimellä *.conf. Esimerkiksi tätä ohjelmaa varten tämä tiedosto näyttää seuraavalta:
$ 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
Sitten sinun on käynnistettävä supervisor uudelleen, tämä voidaan tehdä systemctl:llä:
$ sudo systemctl restart supervisor
Tai supervisorctl-apuohjelmalla
:
$ sudo supervisorctl reload
Voit myös nähdä määritettyjen prosessien tilan komennolla:
Jos prosessi on RUNNING-tilassa, kaikki on hyvin ja se käynnistettiin onnistuneesti. Tässä tapauksessa prosessi on kuitenkin käynnissä yhdessä instanssissa, ja melko usein on tarpeen ajaa useita kopioita samasta prosessista. Tähän tarkoitukseen voimme käyttää parametreja process_name
ja numprocs
. Ensimmäisen avulla voit muuttaa prosessin nimen sisältämään kopion numeron, ja toisen avulla voit määrittää, kuinka monta kopiota on ajettava.
Process_name-muuttuja
sisältää yleensä python-merkkijonon muotoilumallin, joka sisältää ohjelman nimen ja prosessin numeron: %(program_name)s_%(process_num)02d
. Tässä muuttujan nimi on suluissa ja sen jälkeen sen tyyppi. Jos esimerkiksi haluat ajaa samaa ohjelmaa neljässä säikeessä, asetustiedoston tulisi olla tässä muodossa:
$ 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
Nyt meidän on ladattava supervisorctl
uudelleen ja 4 prosessia on käynnissä:
$ sudo supervisorctl status
Samalla on mahdollista tallentaa kaikki ohjelman tuottamat tiedot lokitiedostoon. Tähän tarkoitukseen käytetään parametreja stdout_logfile
ja stderr_logfile
. Voit esimerkiksi tulostaa sen suorituksen lokitiedoston suoraan kansioon, jossa ohjelma on.
$ 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
Kun palvelu käynnistetään uudelleen, lokitiedostot näkyvät kansiossa, jossa ohjelma on:
Vastaavasti, jos haluat ohjata
prosessien tulosteet ohjaajan vakiotulosteeseen, käytä redirect_stderr-
ja redirect_stdout-parametreja.
Jos ohjelmasi tarvitsee ympäristömuuttujia, voit antaa ne ympäristöparametrilla. Muuttujat on kirjoitettava pilkuilla. Esim:
$ environment=DISPLAY=":1",HOME="/root"
Muista käynnistää supervisor uudelleen jokaisen konfiguraatiomuutoksen jälkeen, jotta muutokset tulevat voimaan. Supervisorctl-apuohjelmaa voidaan käyttää prosessien ohjaamiseen. Kuten olet jo huomannut, nähdäksesi luettelon prosesseista sinun on suoritettava:
$ sudo supervisorctl status
Sitten kun tiedät prosessin nimen, voit käynnistää sen uudelleen, esimerkiksi process:process_00
:
$ sudo supervisorctl restart process:process_00
Pysäytä:
$ sudo supervisorctl stop process:process_00
Tai käynnistä:
$ sudo supervisorctl start process:process_00
Vaihtoehtoisesti voit muodostaa yhteyden prosessiin ja nähdä, mitä se antaa stdout/stderr:
ään komennolla fg
:
$ sudo supervisorctl fg process:process_00
Olemme tarkastelleet, miten supervisor
on konfiguroitu ja miten prosessinhallintaohjelmistoa käytetään.