Для управления процессами в Linux существуют системы инициализации, такие как systemd. Однако что, если надо что-то более простое? Например, программа, которая сможет управлять процессами вашего приложения, в системе или в Docker контейнере. Такая программа существует. Она называется supervisor.
Это простой менеджер процессов с открытым исходным кодом, написанный на Python, с помощью которого можно запускать нужное количество копий процесса и следить за их состоянием. В этой статье мы рассмотрим как выполняется установка и настройка Supervisor на примере Ubuntu 20.04.
Содержание статьи
Установка Supervisor в Ubuntu 20.04
Самый простой способ получить программу - установить её из официальных репозиториев. Для этого надо выполнить команду:
sudo apt install supervisor
Если вы хотите чтобы программа работала постоянно, её надо добавить в автозагрузку и запустить. Для этого выполните:
sudo systemctl enable supervisor --now
Затем можно посмотреть состояние с помощью команды:
sudo systemctl status supervisor
Настройка supervisor
Конфигурационный файл программы находится по адресу /etc/supervisor/supervisord.conf. Здесь находятся основные настройки. Для настроек запускаемых процессов лучше использовать директорию /etc/supervisor/conf.d/. Основной конфигурационный файл можно оставить по умолчанию. Давайте рассмотрим как создавать конфигурационные файлы для программ. Синтаксис секции для одного процесса выглядит вот так:
**[program:имя_программы]**имя_переменной=значение
Для каждого процесса минимально надо передать такие переменные для того чтобы он автоматически запускался и восстанавливался после падения:
- 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, а также как пользоваться программой для управления процессами. Как видите программа довольно удобна и проста в использовании. Особенно её удобно применять в Docker, из-за ограничения на один запущенный процесс в контейнере. Вы можете запустить только supervisor, а все остальные процессы настроить в нём.
Anubis – это максимально легкое open-source решение, созданное специально для защиты небольших веб-ресурсов от бесконечного потока запросов от ботов и AI парсеров. Этот инструмент можно считать "ядерным вариантом", потому что он заставляет ботов выполнять вычисления похожие на майнинг криптовалюты. Но это неплохая альтернатива для тех, кто не может или не хочет использовать Cloudflare. Посмотреть детали












Спасибо, отличная статья:)
Благодарю!!! Статья - огонь!!!