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

У меня есть сервер разработки, на который я часто отправляю изменения кода через Git. После каждого нажатия мне нужно вручную войти на сервер и перезапустить процессы супервизора.

Есть ли способ заставить Supervisor отслеживать изменения в каталоге файловой системы и перезагружать процессы при изменениях?


person Naftuli Kay    schedule 26.11.2013    source источник


Ответы (5)


Вы должны иметь возможность использовать прослушиватель событий, который отслеживает файловой системы (возможно, с сторожевым таймером) и запускает перезагрузку с помощью XML-RPC API. Посмотрите прослушиватель memmon из пакета superlance для вдохновения. Это не должно быть так сложно. И поскольку сторожевой таймер вызовет вашу процедуру перезапуска, вам не нужно читать события, используя childutils.listener.wait.

В качестве альтернативы, git hooks могут помочь, если разрешения для доступа к API супервизора верны (разрешения сокетов, пароли HTTP). Более простой, но менее безопасный подход.

Более простым и даже менее безопасным подходом было бы позволить вам создать файл supervisorctl restart. Запущенный пользователь должен совпадать с вашим push-пользователем (или git, или www, в зависимости от того, как вы его настроили). Много способов сделать что-то не так с точки зрения безопасности. Но для развития может подойти.

Связанный:

person soulseekah    schedule 30.11.2013
comment
Итак, на самом деле это не решение, а скорее то, как создать решение. Так что теперь, спустя почти 3 года, все еще нет фактического решения того, что мне кажется чрезвычайно распространенной проблемой? - person hackel; 25.07.2016

Я также не нашел никакого решения, поэтому я попытался сделать свой собственный. Вот оно.

Вы можете установить пакет с помощью этой команды:

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 — сокет из раздела supervisorctl, а program — имя программы из определения раздела [program:<name>]. Также доступны --username и --password, которые вы можете использовать, если у вас есть индивидуальная конфигурация супервизора.

person Stavinsky    schedule 23.08.2016
comment
Спасибо за публикацию этого. Кажется, работает хорошо. Странно, что нет встроенного решения для чего-то подобного - person edwardmp; 22.09.2016
comment
Добро пожаловать. Рад узнать, что это было полезно для кого-то. Если у вас возникнут какие-либо вопросы или идеи, как улучшить этот скрипт, напишите мне здесь или на github. - person Stavinsky; 24.09.2016
comment
Это решение отслеживает только один файл за раз? github.com/gorakhargosh/watchdog позволит вам просмотреть весь каталог. - person nu everest; 04.12.2016
comment
Основная цель моего модуля - перезапустить работу супервизора, если какой-то файл был изменен. Хорошо например использовать с CI. - person Stavinsky; 04.12.2016

Хотя это и не решение, использующее супервизор, я обычно решаю эту проблему в контролируемом приложении. Например, добавьте флаг --reload в gunicorn, и он будет перезагружаться при каждом изменении вашего приложения.

person devnul3    schedule 14.02.2017

У меня была та же проблема, и я создал Superfsmon, который может делать то, что вы хотите: https://github.com/timakro/superfsmon

pip install superfsmon

Вот простой пример из README:

Чтобы перезапустить ваших celery workers при изменениях в каталоге /app/devops, ваш supervisord.conf может выглядеть так.

[program:celery]
command=celery -A devops.celery worker --loglevel=INFO --concurrency=10

[program:superfsmon]
command=superfsmon /app/devops celery
person timakro    schedule 06.04.2018
comment
Имеет ли это какие-то особые преимущества перед github.com/stavinsky/supervisord-touch-reload? упоминается в принятом ответе? - person hackel; 12.04.2018
comment
@hackel У него есть больше возможностей, таких как рекурсивный мониторинг каталогов, фильтрация по расширениям файлов или регулярному выражению и перезапуск нескольких программ (необязательно в группах супервизоров). Это, вероятно, лучше задокументировано и на PyPI. - person timakro; 13.04.2018

Вот одно линейное решение с инструментами inotify:

apt-get install -y inotify-tools
while true; do  inotifywait -r src/ && service supervisor restart; done
person Andriy    schedule 22.02.2021