Supervisor. Настраиваем автоматический перезапуск скриптов

2 min read

Одной из важнейших задач при разработке серверных частей API или Ботов, обрабатывающих различные оповещения, является обеспечение их бесперебойной работы. Иными словами, необходимо автоматизированно произвести запуск всех необходимых скриптов при перезагрузке системы и перезапуск в случае ошибок и падений.

Одним из главных иструментов является supervisor.

Для установки достаточно набрать следующую команду в терминале (считаем что менеджер пакетов pip у вас уже уставнолен. Как это сделать читайте в статье Создаем бота для telegram).

sudo pip install supervisor

Супервизор позволяет следить за состоянием приложений, останавливать, запускать и перезапускать их. Для начала нам нужно создать конфигурационный файл для вашей программы, где мы опишем основные правила перезапуска и логирования. По умолчанию можно воспользоваться файлом:

/etc/supervisor/supervisord.conf

Удалим все содержимое и впишем следующий текст:

[program:github_server] command=python server.py directory=/var/www/codex.bot/ autorestart=true redirect_stderr=true stdout_logfile=/var/www/codex.bot/logs/app_sd.log stdout_logfile_maxbytes=50MB stdout_logfile_backups=50 stdout_capture_maxbytes=1MB stdout_events_enabled=false loglevel=warn

В примере мы указываем, что хотим обеспечить контроль скрипта server.py, находящегося в директории /var/www/codex.bot и уточняем еще пару настроек логирования ошибок. Если супервизор у вас еще не запущен, выполните команду:

supervisord

Теперь можно попросить супервизор прочитать данные из конфига:

supervisorctl reread

Для просмотра статуса запущенных процессов воспользуйтесь командой:

supervisorctl status

Процесс под названием “github_server” (название указывается в конфиге) будет находится в состоянии “STOPPED”.

Запустим его:

supervisorctl start

Теперь в статусе будет отображено состояние “RUNNING”. Для остановки процесса можно пользоваться командой:

supervisorctl stop

Наконец, если принудительно завершить процесс:

sudo killall python

Он все равно будет перезапущен супервизором:

Состояние до завершения: github_server RUNNING pid 21755, uptime 0:03:57 Состояние после завершения: github_server RUNNING pid 21929, uptime 0:00:01

Видно, что сервер был перезапущен. Более подробно можно почитать в официальной документации.