我有一个自动部署工作流,它将代码推送到我的生产服务器并触发数据库迁移、静态文件更新等。问题是,如果没有开发选项,gunicorn 不会自动重新加载代码更改--reload
,他们建议不要在生产中使用开发选项。相反,指令是向发送信号HUP
。masterpid
问题是,我不知道如何masterpid
在自动脚本中检索,尽管手动执行很容易。
如何materpid
在 bash 脚本中检索 gunicorn systemd 进程的值?
答案1
将以下内容添加到 systemd 服务文件中gunicorn
,或将其添加为覆盖:
ExecReload=/bin/kill -HUP $MAINPID
然后您可以使用 重新加载systemctl reload gunicorn
。
答案2
有关编辑 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”。
答案3
我已经为类似问题创建了一个答案这里。与接受的答案相比,这可能是一个更简单的解决方案,特别是在gunicorn
未在系统范围内安装的情况下。
如果链接不起作用
下面一行代码完美地完成了工作:
kill -HUP `ps -C gunicorn fch -o pid | head -n 1`
解释
pc -C gunicorn
仅列出带有命令的进程gunicorn
,即 worker 和掌握过程。工人是掌握如下所示ps -C gunicorn fc -o ppid,pid,cmd
。我们只需要掌握,因此h
使用 flag 删除第一行,即 PID 文本。请注意,f
flag 确保master
打印在 worker 上方。
正确的程序是HUP
只向掌握。这样就gunicorn
优雅地重启了,只有工人被重新创造,而不是主人。