Назад | Перейти на главную страницу

Автоматическая плавная перезарядка Gunicorn в производстве

У меня есть рабочий процесс автоматического развертывания, который отправляет код на мои производственные серверы и запускает миграцию базы данных, обновление статических файлов и т. Д. Проблема в том, что Gunicorn не перезагружает изменения кода автоматически без возможности разработки --reload, которые они не рекомендуют использовать в производстве. Вместо этого инструкция состоит в том, чтобы отправить HUP сигнал к masterpid. Проблема в том, что я не знаю, как получить masterpid в автоматическом сценарии, хотя это достаточно просто сделать вручную.

Как я могу получить materpid значение для процесса Gunicorn systemd в сценарии bash?

Добавьте следующее в служебный файл systemd для gunicorn, или добавьте его как переопределение:

ExecReload=/bin/kill -HUP $MAINPID

Затем вы можете перезагрузить с помощью systemctl reload gunicorn.

Более подробное объяснение редактирования вашего служебного файла Gunicorn (на основе ответа @jordanm):

Отредактируйте свой служебный файл /etc/systemd/system/my_task.service или аналогичный путь

[Unit]
Description=My task running runicorn
After=network.target

[Service]
User=my_user
# [...]
ExecStart=/home/my_user/my_task/.venv/bin/gunicorn --workers 3 --bind unix:my_task.sock -m 007 wsgi:app
ExecReload=/bin/kill -HUP $MAINPID # <------ add this line

[Install]
WantedBy=multi-user.target

Сохраните его, затем запустите следующее, чтобы перезагрузить конфигурацию

sudo systemctl enable my_task

Затем вы можете выполнить следующее, чтобы изящно перезапустить службу Gunicorn (это должно быть выполнено в вашем сценарии развертывания)

sudo systemctl reload my_task gunicorn restart

Если вы не запустите systemctl enable my_task команда, вы можете получить следующую ошибку:

Не удалось перезагрузить my_task.service: перезагрузка типа задания не применима для модуля my_task.service. См. Системные журналы и 'systemctl status my_task.service' для подробностей.

Я создал ответ на аналогичный вопрос Вот. Это может быть более простое решение по сравнению с принятым ответом, особенно в случаях gunicorn не устанавливается в системе.

в случае если ссылка не работает

один лайнер ниже отлично справляется со своей задачей:

kill -HUP `ps -C gunicorn fch -o pid | head -n 1`

Объяснение

pc -C gunicorn перечисляет только процессы с gunicorn команда, т. е. рабочие и мастер обработать. Рабочие - дети мастер как можно увидеть с помощью ps -C gunicorn fc -o ppid,pid,cmd. Нам нужен только идентификатор мастер, следовательно h Флаг используется для удаления первой строки, которая является текстом PID. Обратите внимание, что, f флаг уверяет, что master печатается над рабочими.

Правильная процедура - отправить HUP сигнал только для мастер. В этом случае gunicorn изящно перезапускается, воссоздаются только рабочие, а не хозяин.