Способи оплати Abuse

Як налаштувати SuperVisor

18.04.2022, 23:02

Щоб керувати процесорами в Linux є системи ініціалізації на кшталт systemd. Якщо треба більш просте рішення, програма, яка зможе керувати процесами вашого додатка, в системі або в Docker контейнері. Така програма існує - це supervisor. Функціонально простий менеджер процесів з відкритим вихідним кодом, написаний на Python, за допомогою якого можна запускати потрібну кількість копій процесу і стежити за їхнім станом. Далі розповімо як виконується встановлення та налаштування Supervisor на прикладі Ubuntu 20.04.

Встановлюємо supervisor

Найпростіший спосіб отримати програму - встановити її з офіційних репозиторіїв. Для цього треба виконати команду:

$ sudo apt install supervisor

Як налаштувати SuperVisor

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

$ sudo systemctl enable supervisor --now

Як налаштувати SuperVisor

Далі можна подивитися стан за допомогою команди:

$ sudo systemctl status supervisor

Як налаштувати 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

Як налаштувати SuperVisor

Також ви можете подивитися стан налаштованих процесів за допомогою команди:

Як налаштувати SuperVisor

Якщо процес у статусі 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

Як налаштувати SuperVisor

Одночасно з цим можна зберігати всі дані, що виводяться програмою в лог-файл. Для цього використовуються параметри 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

Так само, якщо ви хочете переспрямувати виведення ваших процесів у стандартне виведення 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

Як налаштувати SuperVisor

Зупинити:

$ sudo supervisorctl stop process:process_00

Або запустити:

$ sudo supervisorctl start process:process_00

Крім того, можна підключиться до процесу і подивитися, що він виводить у stdout/stderr за допомогою команди fg:

$ sudo supervisorctl fg process:process_00

Ми розглянули як виконується налаштування supervisor, а також як користуватися програмою для управління процесами.