Bash
在生產中自動優雅地重新載入 gunicorn
我有一個自動部署工作流程,將程式碼推送到我的生產伺服器並觸發數據庫遷移、靜態文件更新等。問題是,gunicorn 不會在沒有開發選項的情況下自動重新載入程式碼更改
--reload
,他們建議不要在生產中使用。相反,指令是HUP
向masterpid
. 問題是,我不知道如何masterpid
在自動腳本中檢索,儘管手動操作很容易。如何
materpid
在 bash 腳本中檢索 gunicorn systemd 程序的值?
將以下內容添加到 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”。