问题描述:
我的测试环境的django项目是用gunicorn启动的,然后我本地使用python managy.py启动的,新写了个接口,在本地测试没问题,在测试环境报404。我发现发了最新代码到远端 ,然后我在测试环境pull下来的时候出问题了,代码不是最新的,后来我的经理告诉我说要重启gunicorn的主进程 给了我一条指令"kill -HUP gunicorn_pid(最小的)”,针对这个问题我大致做了点功课,大家体会一下。
解决问题:
上述问题是由于在测试环境中,Django 是由 gunicorn
启动的,而 gunicorn
在加载新的代码更新时不会自动刷新。简单来说,当推送新的代码并 pull 下来后,gunicorn
仍在运行旧的代码,因此需要重启进程以加载最新的代码。
指令是:
kill -HUP <gunicorn_pid>
这条指令的含义如下:
-
kill -HUP
:这是一个向进程发送HUP
(Hangup)信号的命令。对于gunicorn
来说,接收到HUP
信号会触发它优雅地重启主进程(master process),同时加载新的代码,而不会中断当前的连接。它相当于热重启,可以不影响服务的可用性。 -
gunicorn_pid
:这是gunicorn
主进程的进程号(PID)。主进程通常是gunicorn
启动时的最早进程,所有的 worker 进程都是由它管理的。你需要找到这个主进程的 PID,然后用这条命令对它进行重启。 -
“最小的”:因为
gunicorn
启动时会创建一个主进程和多个 worker 进程,而主进程的 PID 通常是最小的,所以你需要找到这个最小的 PID 来发送HUP
信号。
如何找到 gunicorn
的 PID
可以通过以下命令找到 gunicorn
的进程:
ps aux | grep gunicorn
这会列出所有 gunicorn
相关的进程,找到最小的那个进程号(通常是主进程的 PID),然后执行 kill -HUP <gunicorn_pid>
来让 gunicorn
重新加载最新的代码。
总结
遇到这种问题所要做的是:
- 通过
ps aux | grep gunicorn
找到主进程的 PID。 - 使用
kill -HUP <gunicorn_pid>
重启主进程,这样gunicorn
会加载最新的代码。
这个过程会在不终止服务的情况下,让 gunicorn
优雅地重启并应用新的代码。