У меня есть рабочий процесс автоматического развертывания, который отправляет код на мои производственные серверы и запускает миграцию базы данных, обновление статических файлов и т. Д. Проблема в том, что 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
изящно перезапускается, воссоздаются только рабочие, а не хозяин.