Есть ли способ автоматически перезагрузить процессы супервизора?
У меня есть dev-сервер, который я часто нажимаю изменения кода на Git. После каждого нажатия мне нужно вручную войти в сервер и перезапустить процессы супервизора.
есть ли способ, чтобы Супервизор контролировал каталог файловой системы для изменений и перезагружал процесс(ы) при изменениях?
4 ответов
вы должны иметь возможность использовать Прослушивателя Событий который контролирует файловую систему (возможно,сторож) и выдает перезапуск с помощью XML-RPC API. Проверьте memmon
слушателя от superlance пакет для вдохновения. Это не должно быть так сложно. И поскольку сторожевой пес вызовет вашу процедуру перезапуска, вам не нужно читать события с помощью childutils.listener.wait
.
альтернативно, крючки git могут сделать трюк, если разрешения правильны для доступа к API супервизора (разрешения сокета, пароли HTTP). Более простой, но менее безопасный подход.
более простым и еще менее безопасным подходом было бы позволить вам выпустить supervisorctl restart
. Работающий пользователь должен соответствовать вашему пользователю push (или git, или www, в зависимости от того, как вы его настроили). Есть много способов, чтобы все пошло не так с точки зрения безопасности. Но для развития, может сделать штраф.
по теме:
Я также не нашел никакого решения, поэтому я попытался сделать свой собственный. здесь.
вы можете установить пакет с помощью следующей команды:
pip install git+https://github.com/stavinsky/supervisord-touch-reload.git
(Я добавлю его в PyPI после добавления некоторых тестов. )
пример настройки супервизора, расположенного в папке examples в github. Документы будут очень скоро, я полагаю.
В основном все, что вам нужно, чтобы начать использовать этот модуль добавить прослушиватель событий с command
например:
python -m touch_reload --socket unix:///tmp/supervisor.sock --file <path/to file file> --program <program name>
здесь file
- это файл, который будет контролироваться с абсолютной или относительной для directory
путь, socket
розетка от и program
- имя программы из [program:<name>]
определение сечения.
Также доступно --username
и --password
, который вы можете использовать, если у вас есть настраиваемая конфигурация супервизора.
хотя это не решение, которое использует супервизор, я обычно решаю эту проблему в контролируемом приложении. Например, добавьте флаг --reload в gunicorn, и он будет перезагружаться при каждом изменении вашего приложения.
Я имел такую же проблему и создали Superfsmon, который может делать то, что вы хотите: https://github.com/timakro/superfsmon
pip install superfsmon
вот простой пример из README:
чтобы перезапустить работников сельдерея на изменения в
/app/devops
каталогsupervisord.conf
может выглядеть следующим образом.[program:celery] command=celery -A devops.celery worker --loglevel=INFO --concurrency=10 [program:superfsmon] command=superfsmon /app/devops celery