Есть ли способ автоматически перезагрузить процессы супервизора?

У меня есть 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