Не так давно мені довелось розв'язувати задачу «демонізації» пайтонівського скрипта (зі стартом його після старту самої ОС). Для Ubuntu вдалось усе зробити вручну (fork
python процесу від батьківського і копіювання потрібного файлу до /etc/init.d/
та ще кілька дрібниць). А от для FreeBSD треба було робити інакше. І хоч ця ОС має аналогічну систему сервісів /etc/rc.d
+ /usr/local/etc/rc.d
, повторити штуку, як на Ubuntu, мені не вдалось. Тому я вирішив зробити це за допомогою добре відомого, громіздкого, але універсального інструмента – supervisor
. Тут я розкажу найпростіший випадок налаштування supervisor
. Можливо в іншій статті опишу варіант зі складнішими налаштуваннями.
Встановлення
Як ставити supervisor
? Це просто, якщо вірити посібнику на сайті інструменту:
easy_install supervisor
або
pip install supervisor
Проблема у тому, що у нас (принаймні початково після установки FreeBSD) ні easy_install
, ні pip
, ані python
немає. Треба встановлювати.
У командному рядку FreeBSD переходимо у режим root
:
login root
або
su –
Вводимо пароль адміністратора. Далі пишемо:
pkg install python
Система повідомить нас, що у нас і pkg
немає, але запропонує його поставити. Погоджуємося. Усе разом з python-ом 2.7.ХХ
має успішно встановитись.
Тепер треба поставити окремо pip
(хоча ми мали отримати його разом з python
). Пишемо у командному рядку:
python –m ensurepip
Ще є варіант (якщо з якихось причин попередні у вас не запрацювали) завантажити файл get-pip.py
, але робити це треба curl
, який знає, що таке SSL:
curl –O https://bootstrap.pypa.io/get-pip.py
Прапорець –O
означає «завантажити файл з початковим іменем у поточну директорію». Якщо curl
немає, ставимо його:
pkg install curl
Потім треба виконати завантажений скрипт:
python get-pip.py
Виконуємо команду:
pip install supervisor
Створюємо файл налаштувань (потрібні права адміністратора):
echo_supervisord_conf > /etc/supervisord.conf
Тепер нам потрібен скрипт, який налаштує нам supervisor
, тобто скрипт ініціалізації. Можливо у вас ще немає директорії /usr/local/etc/rc.d
. У такому разі створіть теку rc.d
mkdir /usr/local/etc/rc.d
Тепер створіть файл /usr/local/etc/rc.d/supervisord
і запишіть у нього:
#!/bin/sh
# PROVIDE: supervisord
# REQUIRE: DAEMON
# KEYWORD: shutdown
. /etc/rc.subr
name=supervisord
rcvar=supervisord_enable
load_rc_config $name
command="/usr/local/bin/${name}"
command_interpreter="/usr/local/bin/python"
run_rc_command "$1"
Також зробіть його виконуваним:
chmod +x /usr/local/etc/rc.d/supervisord
Маючи скрипт у вказаній теці, ми отримуємо можливість автоматичного завантаження supervisor
відразу після завантаження ОС.
Додайте у файл /etc/rc.conf
таке:
supervisord_enable="YES"
Розгортаємо у текстовому редакторі (якщо не знаєте vi
, використайте ee
) згенерований нами файл /etc/supervisord.conf
та змінимо частину [program:x]
.
Для прикладу, отакий вигляд матиме розділ з програмою <project>_uwsgi
, у якому будуть вказівки для вашого uWSGI:
[program:<project>_uwsgi]
; Шлях до проекту (chdir)
directory=/<project>
; Команда для запуску програми
command=/<project>/venv/bin/uwsgi /<project>/uwsgi/production.ini
; При завантаженні самого supervisor запускати програму
autostart=true
; Якщо програма аварійно завершилась, то перезапускати її
autorestart=true
; Перенаправлення отриманого STDERR у відповідь supervisor в STDOUT (еквівалент /the/program 2>&1)
redirect_stderr=true
; Тайм-аут в секундах, після якого supervisor надішле SIGKILL процесу,
; якому до цього посилав SIGCHLD
stopwaitsecs=60
; Який сигнал посилати для зупинки програми
stopsignal=INT
; Шлях до error-лоґу
stderr_logfile=/<project>/log/<project>/wsgi_err.log
; Шлях до output-лоґу
stdout_logfile=/<project>/log/<project>/wsgi_out.log
Використання
Для запуску supervisor
(якщо перезавантажите ОС, то він вже працюватиме) скомандуйте:
/usr/local/etc/rc.d/supervisord start
Тепер виконайте у консолі команду:
supervisorctl
Ви побачите таке:
supervisor> status
<project>_uwsgi RUNNING pid 54020, uptime 0:01:11
де <project>_uwsgi
– ім'я вашої програми, а running
– чинний стан вашої програми.
Можна залучити supervisorctl
ще так:
supervisorctl status <project>_uwsgi
supervisorctl restart <project>_uwsgi
На цьому я закінчу. Статті належалось розказати про встановлення supervisor
, що і було зроблено. Використання його з користувацькими програмами – вже окрема тема.
Сподіваюсь, стаття була вам корисна. Щасти!
Ще немає коментарів