Щоб керувати процесорами в 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/.
Основний конфігураційний файл можна залишити за замовчуванням. Давайте розглянемо як створювати конфігураційні файли для програм. Синтаксис секції для одного процесу виглядає ось так:
variable name value
Для кожного процесу мінімально треба передати такі змінні для того, щоб він автоматично запускався і відновлювався після падіння:
directory
- робоча директорія;command
- команда запуску процесу;user
- користувач, від імені якого буде запущено процес;autostart
- чи потрібно автоматично запускати процес;autorestart
- чи потрібно перезапускати процес;Однак доступних налаштувань набагато більше, ось деякі з тих, які будуть розглянуті в цій статті:
priority
- пріоритет процесу, що запускається;environment
- змінні оточення, які треба передати процесу;stdout_logfile
- куди перенаправляти виведення stdout процесу;stderr_logfile
- куди перенаправляти виведення stderr процесу;process_name
- назва процесу, з можливістю підстановки номера копії;numprocs
- кількість запущених копій процесу;startretries
- кількість спроб запустити програму;redirect_stderr
- переспрямувати виведення помилок процесу у виведення supervisor;redirect_stdout
- переспрямувати виведення процесу у виведення supervisor.Для кращого розуміння і прикладу виконаємо скрипт на PHP, який просто висітиме у фоні:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Для процесу можна створити окремий файл із конфігурацією supervisor. Ви можете вставляти конфігурацію прямо в кінець основного конфігураційного файлу, але так краще не робити. Краще для кожної програми створювати окремий конфігураційний файл у каталозі /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
Після перезавантаження сервісу в папці з програмою з'являться логи:
Так само, якщо ви хочете переспрямувати виведення ваших процесів у стандартне виведення supervisor, слід використовувати параметри 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
Ми розглянули як виконується налаштування supervisor
, а також як користуватися програмою для управління процесами.