Чтобы управлять процессорами в 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
, а также как пользоваться программой для управления процессами.