За управление на процесорите в Linux има системи за инициализация като systemd. Ако се нуждаете от по-опростено решение, можете да използвате програма, която да управлява процесите на вашето приложение - или в системата, или в контейнер Docker. Такава програма съществува - тя е supervisor. Това е функционално прост мениджър на процеси с отворен код, написан на Python, който може да се използва за стартиране на толкова копия на даден процес, колкото е необходимо, и за наблюдение на тяхното състояние. По-долу ще ви покажем как да инсталирате и конфигурирате Supervisor, като за пример ще използваме Ubuntu 20.04.
Най-лесният начин да се сдобиете с програмата е да я инсталирате от официалните хранилища. За да направите това, трябва да изпълните командата:
$ sudo apt install supervisor
Ако искате програмата да се изпълнява постоянно, трябва да я добавите към вашия автозадавач и да я стартирате. Изпълнете:
$ sudo systemctl enable supervisor --now
След това можете да видите състоянието, като използвате командата:
$ sudo systemctl status supervisor
Конфигурационният файл се намира на адрес /etc/supervisor/supervisord.conf.
Това е и мястото, където се намират основните настройки. По-добре е да използвате директорията /etc/supervisor/conf.d/
за конфигуриране на работещите процеси. Основният конфигурационен файл може да бъде оставен по подразбиране. Нека видим как да създадем конфигурационни файлове за програмите. Синтаксисът на раздел за един процес изглежда по следния начин:
променлива име стойност
За всеки процес е необходимо да се подадат такива променливи, за да може той да се стартира автоматично и да се възстановява след срив:
directory
- работна директория;
command
- команда за стартиране на процеса; user
- потребител, от чието име ще бъде стартиран процесът;
autostart
- дали процесът трябва да се стартира автоматично; autorestart
- дали процесът трябва да бъде рестартиран;
Налични са обаче много повече настройки, ето някои от тях, които ще бъдат разгледани в тази статия:
приоритет
- приоритет на процеса, който ще бъде стартиран;
environment
- променливи на средата, които да се предават на процеса;
stdout_logfile
- къде да се пренасочи изходът stdout на процеса;
stderr_logfile
- къде да се пренасочи изходът stderr на процеса; process_name
- име на процеса, с възможност за заместване на номера на копието;
numprocs
- брой на копията на процеса, който ще бъде стартиран;
startretries
- брой опити за стартиране на програмата;
redirect_stderr
- пренасочване на изхода за грешки на процеса към изхода на супервайзора;
redirect_stdout
- пренасочване на изхода на процеса към изхода на супервайзора.За по-добро разбиране и пример, нека изпълним PHP скрипт, който просто ще виси във фонов режим:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Можете да създадете отделен конфигурационен файл на супервайзора за процеса. Можете да вмъкнете конфигурацията точно в края на основния конфигурационен файл, но е по-добре да не го правите. По-добре е да създадете отделен конфигурационен файл за всяка програма в /etc/supervisor/conf.d/
с име *.conf. Например, за тази програма този файл ще изглежда така:
$ 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
След това трябва да рестартирате supervisor, това може да стане със systemctl:
$ sudo systemctl restart supervisor
или с помощната програма supervisorctl
:
$ sudo supervisorctl reload
Можете също така да видите състоянието на конфигурираните процеси, като използвате командата:
Ако процесът е в състояние RUNNING, значи всичко е наред и е стартиран успешно. Но в този случай процесът се изпълнява в една инстанция, а доста често се налага да стартирате няколко копия на един и същ процес. За тази цел можем да използваме параметрите process_name
и numprocs
. Първият ви позволява да промените името на процеса, така че да съдържа номера на копието, а вторият ви позволява да посочите колко копия трябва да бъдат стартирани.
Променливата process_name
обикновено съдържа шаблон за форматиране на низ на Python, който съдържа името на програмата и номера на процеса: %(program_name)s_%(process_num)02d
. Тук името на променливата е в скоби, последвано от нейния тип. Например, за да стартирате една и съща програма в четири нишки, конфигурационният файл трябва да бъде зададен в този вид:
$ 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
Сега трябва да презаредим supervisorctl
отново и ще бъдат изпълнени 4 процеса:
$ sudo supervisorctl status
В същото време е възможно всички данни, изведени от програмата, да се запишат в лог файла. За тази цел се използват параметрите stdout_logfile
и stderr_logfile
. Например, можете да изведете лог файла от изпълнението му директно в папката с програмата.
$ 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
След рестартиране на услугата журналните файлове ще се появят в папката с програмата:
По същия начин, ако искате да пренасочите
изхода на вашите процеси към стандартния изход на супервайзора, трябва да използвате параметрите redirect_stderr
и redirect_stdout
. Ако програмата ви се нуждае от някакви променливи на средата, можете да ги предадете с помощта на параметъра environment (среда). Променливите трябва да се записват със запетаи. Например:
$ environment=DISPLAY=":1",HOME="/root"
След всяка промяна в конфигурацията не забравяйте да рестартирате supervisor, за да приложите промените. Помощната програма supervisorctl може да се използва за управление на процеси. Както вече разбрахте, за да видите списъка на процесите, трябва да го изпълните:
$ sudo supervisorctl status
След това, като знаете името на процеса, можете да го рестартирате, например process:process_00
:
$ sudo supervisorctl restart process:process_00
Спрете:
$ sudo supervisorctl stop process:process_00
или да стартирате:
$ sudo supervisorctl start process:process_00
Алтернативно, можете да се свържете с процеса и да видите какво извежда той на stdout/stderr
, като използвате командата fg
:
$ sudo supervisorctl fg process:process_00
Разгледахме как се конфигурира супервайзор
и как се използва софтуерът за управление на процеси.