Raspberry Pi. Контроль выполнения процессов с помощью Supervisor

При использовании Raspberry Pi во встраиваемых решениях, что диктуется зачастую удобством написания скриптов на любимом вам языке (которые выполняются как процессы), встает проблема — как отслеживать их выполнение и перезапускать их при нештатных ситуациях? Запуск обычно решается написанием rc.d скрипта для каждого нужного вам процесса, но rc.d скрипт не может автоматически перезапустить упавший процесс, а ваш процесс далеко не всегда имеет возможность перезапустить самого себя. Данные вопросы легко решаются с помощью Supervisor.

Исходные условия:

  1. Raspberry (версия не важна);
  2. Raspbian;
  3. Подключение к интернету.

Описание, фичи и компоненты Supervisor

Supervisor — это клиент-серверная система, позволяющая контролировать процессы на UNIX-подобных операционных системах. Supervisor запускает процессы как свои субпроцессы и может быть сконфигурирован на их автоматический перезапуск при краше.

Основыными фичами Supervisor являются:

  • Простота. Supervisor конфигурируется с помощью простого INI-подобного конфига, в котором очень просто разобраться (комментарии и правда шикарные, к каждой строке). Конфиг обеспечивает большое количество опций для каждого процесса, которые дают вам удобные настройки — например, рестарт процесса и автоматическая ротация логов.
  • Централизованность. Supervisor обеспечивает вас одним местом для запуска, остановки и мониторинга ваших процессов. Процессы могут контролироваться как индивидуально, так и по группам. Вы можете сконфигурировать Supervisor для предоставления локальной или удаленной командной строки и/или веб-интерфейса.
  • Эффективность. Supervisor запускает свои субпроцессы через fork/exec, что не делает процессы демонами. ОС мгновенно сигнализирует Supervisor’у в случаях, если процесс был завершен.
  • Расширяемость. Supervisor имеет простой событийный протокол оповещения, для мониторинга которого могут быть написаны программы на любом языке, и интерфейс XML-RPC для управления.
  • Совместимость. Supervisor работает практически на всех ОС, кроме Windows — Linux, Mac OS X, Solaris, FreeBSD; написан полностью на Python, поэтому его установка не требует компилятора Си;
  • Надежность. Supervisor активно развивается, но появился не вчера — проекту уже несколько лет и он уже используется на множестве серверов.

Основные компоненты Supervisor:

  • supervisord. Серверная часть, отвечающая за функционирование дочерних процессов, действия в ответ на команды от клиентов, логгирование stdout и stderr своих дочерних процессов, а также за генерацию и обработку «событий». Серверная часть использует конфигурационный файл, который обычно располагается в /etc/supervisord.conf
  • supervisorctl. Это клиент командной строки, который обеспечивает интерфейс к supervisord. С помощью этого клиента вы можете подсоединяться к различным процессам supervisord, получать статус субпроцессов и управлять ими. Взаимодействие с supervisord осуществляется либо через UNIX-сокет, либо TCP-сокет.
  • Веб-сервер. Обеспечивает доступ к supervisord через веб-браузер с функционалом supervisorctl.
  • Интерфейс XML-RPC. Веб-сервер также имеет интерфейс XML-RPC, который может использоваться для опроса и контроля Supervisor и программ, запущенных им.

Установка

Самый простой способ — установка через менеджер пакетов:

Другие способы — установка либо через easy_install, либо через pip (последний — предпочтительней). Важно заметить, что при такой установке Supervisor не будет автоматически запускаться при загрузке ОС и необходимо будет решить данный вопрос c использованием вот этой статьи.

Конфигурация

Как только установка Supervisor завершена, запустите команду

Данная команда выведет в консоль стандартный файл конфигурации Supervisor.

Важное замечание — если устанавливать через pip, то данная команда отрабатывает корректно (по крайней мере, у меня). Если устанавливать через менеджер пакетов, то может вываливаться ошибка о том, что файл примера конфигурации не найден. Для решения данной проблемы воспользуйтесь мануалом, указанным в echo_supervisord_conf not working

Как только вы убедитесь, что данная команда корректно работает, можно создать файл конфигурации:

Как только файл успешно создан, можно модифицировать его для выполнения необходимых вам функций.

Добавление субпроцесса Supervisor

За добавление субпроцесса в supervisord.conf отвечает секция [program:x], где х — название субпроцесса.

Откроем файл с конфигурацией:

И найдем [program:theprogramname]

Как не сложно догадаться, точка с запятой комментирует строку. Рассмотрим самые базовые настройки субпроцесса:

  • theprogramname. Имя субпроцесса — задается для более удобного управления;
  • command. Команда для запуска. Поддерживает параметры;
  • autostart. Если =true, программа будет запускаться вместе со стартом supervisord;
  • autorestart. Может иметь три значения — false, unexpected, true. Если значение =false, то программа не будет перезапускаться, если =true — то будет всегда перезапускаться при завершении (не важно, с каким кодом). Если =unexpected, то программа будет перезапускаться, если программа завершается с кодом, который не указан в параметре exitcodes для данного субпроцесса;
  • exitcodes. Лист ожидаемых кодов завершения программы. См. autorestart выше;
  • redirect_stderr. Если =true, то эквивалентно /the/program 2>&1. Данный параметр перенаправляет стандартный вывод stderr субпроцесса в stdout;
  • stdout_logfile. Путь к файлу с логом потока стандартного вывода субпроцесса. Лог настраивается также параметрами stdout_logfile_maxbytes и stdout_logfile_backups;
  • stderr_logfile. Путь к файлу с логом потока стандартного  вывода ошибок. Лог настраивается также параметрами stderr_logfile_maxbytes и stderr_logfile_backups;

Таким образом, раскомментировав необходимые параметры и присвоив им нужные значения, вы добиваетесь нужной вам работы субпроцесса и его перезапуска.

Рассмотрим на конкретном примере. Мне необходимо, чтобы мой скрипт:

  • Запускался со стартом системы;
  • Автоматически перезапускался при любых условиях;
  • Логи хранились в /tmp/justdoit_stdout.log и /tmp/justdoit_stderr.log (указывать отдельный лог  и его параметры для stderr не обязательно, если stderr перенаправляется в stdout, т.к. файл для stderr не будет создан);
  • stderr перенаправлялся в stdout (т.к. при работе скрипта используется модуль logging, который выводит сообщения в stderr);
  • Размер логов — 1 МБ без бекапов.

Получается следующая конфигурация:

Веб-интерфейс

Supervisor имеет встроенную возможность поднимать веб-интерфейс для управления процессами и просмотра логов процессов. Настраивается в разделе конфига [inet_http_server], который необходимо раскоментировать и подправить для ваших нужд.

Ниже приведена конфигурация для веб-сервера на 9001 порту c логином «user» и паролем «userpass«:

Здесь только один «тонкий» момент — port=*:9001 — указание вместо IP-адреса звездочки позволяет обращаться к данному порту из сети. Если указать адрес 127.0.0.1:9001, то доступ к веб-интерфейсу будет возможен только с Raspberry Pi! Также, при удалении параметров username и password, сервер будет открытым (т.е. без авторизации), т.к. по умолчанию данные параметры пустые.

Теперь при перезапуске supervisord будет поднят веб-сервер на адресе, соответствующем адресу Raspberry Pi в вашей сети, например 10.10.0.100:9001.

supervisor_web_interfaceКликнув по имени процесса, вы просмотрите последние строки log-файла потока stdout вашего процесса, а при нажатии на tail -f вы сможете просматривать log в режиме реального времени. Также вы можете управлять процессом, останавливая и перезапуская его.

Резюме

Supervisor — отличное решение для управления работой вашими скриптами и позволяет разом решить следующие задачи:

  • Автозапуск скриптов;
  • Watchdog’и для скриптов;
  • Перенаправление stdout и stderr ваших скриптов в логи и из авторотацию;
  • Интерфейс для управления скриптами и просмотра логов, в т.ч. веб-интерфейс;
  • Автоматизация управления работой скриптов.

Решение вышеперечисленных задач позволяет больше времени уделить непосредственно решению софтовой и хардварной составляющих вашего проекта.

В статье указаны не все возможности данного пакета, так что для более глубокой изучения возможностей обратитесь к сайту проекта supervisord.org

Полезные ссылки

  1. Сайт проекта supervisord.org
  2. Configuration file Supervisor
  3. How to automatically start supervisord on Linux (Ubuntu)
  4. echo_supervisord_conf not working
  5. Python logging module HOWTO

 

Сохранить

1 Comment for “Raspberry Pi. Контроль выполнения процессов с помощью Supervisor”

says:

[…] Как итог, теперь ваша файловая система более надежно защищена от непредвиденных обстоятельств. Но только этого недостаточно для создания встраиваемого решения на основе Raspberry Pi — нужен еще Watchdog и система управления процессами. […]

Добавить комментарий