Raspberry Pi. Контроль виконання процесів за допомогою Supervisor (переклад)

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

Вихідні умови:

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

Опис, можливості і компоненти 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 і програм, запущених ним.

Інсталяція

Найпростіший спосіб – установка через менеджер пакетів:

sudo apt-get update
sudo apt-get install supervisor

Інші способи – установка або через easy_install, або через pip (останній – має переваги). Важливо зауважити, що при такій установці Supervisor автоматично запускатися при завантаженні ОС не буде і необхідно буде вирішити дане питання c використанням ось цієї статті.

sudo easy_install supervisor
sudo pip install supervisor

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

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

echo_supervisord_conf (може запросити root-івські права)

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

Важливе зауваження – якщо встановлювати через pip, то дана команда відпрацьовує коректно (по крайній мірі у мене). Якщо встановлювати через менеджер пакетів, то може вивалюватися помилка про те, що файл прикладу конфігурації не знайдено. Для вирішення даної проблеми скористайтеся мануалом, зазначеним в echo_supervisord_conf not working

Як тільки ви переконаєтеся, що дана команда коректно працює, можна створити файл конфігурації:

sudo sh -c "echo_supervisord_conf > /etc/supervisor/supervisord.conf"

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

Додавання субпроцесів Supervisor

За додавання субпроцесів в supervisord.conf відповідає секція [program: x], де х – назва субпроцесу.

Відкриємо файл з конфігурацією:

sudo nano /etc/supervisor/supervisord.conf

І шукаємо [program:theprogramname]

;[program:theprogramname]
;command=/bin/cat ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1 ; number of processes copies to start (def 1)
;directory=/tmp ; directory to cwd to before exec (def no cwd)
;umask=022 ; umask for process (default None)
;priority=999 ; the relative start priority (default 999)
;autostart=true ; start at supervisord start (default: true)
;autorestart=true ; retstart at unexpected quit (default: true)
;startsecs=10 ; number of secs prog must stay running (def. 1)
;startretries=3 ; max # of serial start failures (default 3)
;exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT ; signal used to kill process (default TERM)
;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
;user=chrism ; setuid to this UNIX account to run the program
;redirect_stderr=true ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10 ; # of stdout logfile backups (default 10)
;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false ; emit events on stdout writes (default false)
;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10 ; # of stderr logfile backups (default 10)
;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false ; emit events on stderr writes (default false)
;environment=A=1,B=2 ; process environment additions (def no adds)
;serverurl=AUTO ; override serverurl computation (childutils)

Як не складно здогадатися, крапка з комою коментує рядок. Розглянемо базові настройки субпроцесів:

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 МБ без бекапів.
Виходить наступна конфігурація:

[program:mesh_3m]
command=python /home/pi/justdoit.py
process_name=%(program_name)s
numprocs=1
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/tmp/justdoit_stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=0
stderr_logfile=/tmp/justdoit_stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=0

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

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

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

[inet_http_server]
port=*:9001
username=user
password=userpass

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

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

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

Резюме

Supervisor – відмінне рішення для управління роботою ваших скриптів і дозволяє разом вирішити такі завдання:

Автозапуск скриптів;

Watchdog’і для скриптів;

Перенаправлення stdout і stderr ваших скриптів в логи і з авторотацією;

Інтерфейс для керування скриптами і перегляду логів, в т.ч. веб-інтерфейс;

Автоматизація управління роботою скриптів.

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

У статті вказані в повному обсязі можливості даного пакета, так що для більш глибокої вивчення можливостей зверніться до сайту проекту supervisord.org

Оригінальна стаття: http://lab409.ru/raspberry-pi-supervisor/

Оставить ответ

Обязательные поля помечены*

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.